diff --git a/ViMM/.ViMM.rbuistate b/ViMM/.ViMM.rbuistate index f55ae74..196ccf8 100755 Binary files a/ViMM/.ViMM.rbuistate and b/ViMM/.ViMM.rbuistate differ diff --git a/ViMM/App.rbbas b/ViMM/App.rbbas old mode 100755 new mode 100644 index 4303019..1c941a9 --- a/ViMM/App.rbbas +++ b/ViMM/App.rbbas @@ -1 +1 @@ -#tag Class Protected Class App Inherits Application #tag Event Sub Close() Preferences.WriteDefaults If SpecialFolder.Temporary.Child( App.Identifier ).Exists Then SpecialFolder.Temporary.Child( App.Identifier ).Delete End Sub #tag EndEvent #tag Event Sub Open() App.DebugMode = Keyboard.AsyncAltKey RegisterMBS HelpAbout.Text = Menu.HelpAbout + App.kAppName Preferences.LoadDefaults Growl.Register // Register growl nc.Register // Register Notification Center 'VersionCurrent = App.ShortVersion.ReplaceAll("v", "Version ") VersionCurrent = str( App.MajorVersion ) + "." + str( App.MinorVersion ) If App.BugVersion > 0 Then VersionCurrent = VersionCurrent + "." + str( App.BugVersion ) If App.StageCode = 2 Then VersionCurrent = VersionCurrent + "β" + str( App.NonReleaseVersion ) If App.StageCode = 1 Then VersionCurrent = VersionCurrent + "α" + str( App.NonReleaseVersion ) #If TargetCocoa Then VersionCurrent = VersionCurrent + "c" #If TargetCarbon Then VersionCurrent = VersionCurrent + "i" 'If Experimental Then VersionCurrent = VersionCurrent + Chr(13) + "Nightly" #If DebugBuild then 'InitializeSparkle("http://localhost/~Vidal/appcast-alpha.xml") // Local testing InitializeSparkle("https://raw.githubusercontent.com/vidalvanbergen/ViMediaManager/gh-pages/appcast-cocoa.xml") // Official Cocoa AppCast #ElseIf TargetCocoa Then InitializeSparkle("https://raw.githubusercontent.com/vidalvanbergen/ViMediaManager/gh-pages/appcast-cocoa.xml") // Official Cocoa AppCast #ElseIf TargetCarbon Then InitializeSparkle("https://raw.githubusercontent.com/vidalvanbergen/ViMediaManager/gh-pages/appcast-intel.xml") // Official Intel AppCast #Else InitializeSparkle("https://raw.githubusercontent.com/vidalvanbergen/ViMediaManager/gh-pages/appcast-alpha.xml") #EndIf If NOT SpecialFolder.Temporary.Child( App.Identifier ).Exists Then SpecialFolder.Temporary.Child( App.Identifier ).CreateAsFolder End Sub #tag EndEvent #tag Event Function UnhandledException(error As RuntimeException) As Boolean dlgProgress.Close Dim w as New wndBugReporter w.Init( error, "Unknown (caught at app level)" + chr(13) + ErrorMessage ) Return True End Function #tag EndEvent #tag MenuHandler Function EditPreferences() As Boolean Handles EditPreferences.Action wndPreferences.Show Return True End Function #tag EndMenuHandler #tag MenuHandler Function FileQuit() As Boolean Handles FileQuit.Action Quit Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpAbout() As Boolean Handles HelpAbout.Action wndAbout.Show Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpCheckforUpdates() As Boolean Handles HelpCheckforUpdates.Action Sparkle.checkForUpdates Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpContactAuthor() As Boolean Handles HelpContactAuthor.Action ShowURL "mailto:vimediamanager@gmail.com?subject=ViMediaManager Contact Author" Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpDonate() As Boolean Handles HelpDonate.Action ShowURL DonationURL Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpDownloadStudioLogosets() As Boolean Handles HelpDownloadStudioLogosets.Action MsgBox Loc.kInstructions + chr(13) + chr(13) + kLogoPackInstructions ShowURL ( "http://forum.xbmc.org/showthread.php?t=100652" ) ShowURL ( "http://forum.xbmc.org/showthread.php?t=99554" ) Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpRequest() As Boolean Handles HelpRequest.Action Dim Experiment as String If Experimental Then Experiment = " Nightly" ShowURL "mailto:vimediamanager@gmail.com?subject=ViMediaManager Request Help (v" + VersionCurrent + Experiment + ")" Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpSuggestion() As Boolean Handles HelpSuggestion.Action Dim Experiment as String If Experimental Then Experiment = " Nightly" ShowURL "mailto:vimediamanager@gmail.com?subject=ViMediaManager Suggestion (v" + VersionCurrent + Experiment + ")" Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpVisitKodiForumThread() As Boolean Handles HelpVisitKodiForumThread.Action ShowURL XBMCForumURL Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpVisitWebsite() As Boolean Handles HelpVisitWebsite.Action ShowURL "http://vidalvanbergen.github.com/ViMediaManager/" Return True End Function #tag EndMenuHandler #tag MenuHandler Function WindowBringAlltoFront() As Boolean Handles WindowBringAlltoFront.Action For i as Integer = WindowCount - 1 DownTo 0 Window( WindowCount - 1 ).Show Next Return True End Function #tag EndMenuHandler #tag Method, Flags = &h21 Private Function HandleSparkleCancelQuit() As Boolean Return True End Function #tag EndMethod #tag Method, Flags = &h21 Private Sub HandleSparkleFoundVersion(isNew as Boolean, version as String) Dim Major, Minor, Bug, Stage, NonRelease As Integer = 0 Dim VersionPart() as String = Version.Split(".") If VersionPart.Ubound = -1 then Return Major = Val( VersionPart(0) ) If VersionPart.Ubound >= 1 then Minor = Val( VersionPart(1) ) If VersionPart.Ubound >= 2 then Bug = Val( VersionPart(2) ) If VersionPart.Ubound >= 3 then Stage = Val( VersionPart(3) ) If VersionPart.Ubound >= 4 then NonRelease = Val( VersionPart(4) ) VersionNew = str( Major ) + "." + str( Minor ) If Bug > 0 then VersionNew = VersionNew + "." + str( Bug ) If Stage = 2 Then VersionNew = VersionNew + "β" + str( NonRelease ) If Stage = 1 Then VersionNew = VersionNew + "α" + str( NonRelease ) VersionNew = Version End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub InitializeSparkle(FeedURL as String) Dim SparkleFramework as FolderItem = App.ApplicationBundle.Child("Contents").Child("Frameworks").Child("Sparkle.framework") if NOT SUUpdaterMBS.LoadFramework( SparkleFramework ) then Log "Failed to load sparkle framework", 2 Return // Exit end if Sparkle = New SUUpdaterMBS Sparkle.feedURL = FeedURL dim d as Date = Sparkle.lastUpdateCheckDate if d = Nil then Sparkle.automaticallyChecksForUpdates = True end if if Sparkle.automaticallyChecksForUpdates then Sparkle.checkForUpdatesInBackground end if Exception err as NSExceptionMBS Log "Sparkle Update Failed, " + err.Message, 2 End Sub #tag EndMethod #tag Property, Flags = &h0 DebugMode As Boolean = False #tag EndProperty #tag Property, Flags = &h0 ErrorMessage As String #tag EndProperty #tag Property, Flags = &h0 Experimental As Boolean = False #tag EndProperty #tag Property, Flags = &h0 ScalingFactor As Integer = 1 #tag EndProperty #tag Property, Flags = &h0 Sparkle As SUUpdaterMBS #tag EndProperty #tag Property, Flags = &h0 VersionCurrent As String #tag EndProperty #tag Property, Flags = &h0 VersionNew As String #tag EndProperty #tag Constant, Name = Category, Type = String, Dynamic = False, Default = \"Video", Scope = Public #tag EndConstant #tag Constant, Name = DonationURL, Type = String, Dynamic = False, Default = \"https://www.paypal.com/cgi-bin/webscr\?cmd\x3D_donations&business\x3Dvidal%2evanbergen%40gmail%2ecom&lc\x3DGB&item_name\x3DSupport%20ViMediaManager%20development¤cy_code\x3DEUR&bn\x3DPP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted", Scope = Public #tag EndConstant #tag Constant, Name = Identifier, Type = String, Dynamic = False, Default = \"com.vidalvanbergen.vimediamanager-alpha", Scope = Public #tag EndConstant #tag Constant, Name = kAppName, Type = String, Dynamic = False, Default = \"ViMediaManager", Scope = Public #tag EndConstant #tag Constant, Name = kEditClear, Type = String, Dynamic = False, Default = \"&Delete", Scope = Public #Tag Instance, Platform = Windows, Language = Default, Definition = \"&Delete" #Tag Instance, Platform = Linux, Language = Default, Definition = \"&Delete" #tag EndConstant #tag Constant, Name = kFileQuit, Type = String, Dynamic = True, Default = \"&Quit", Scope = Public #Tag Instance, Platform = Windows, Language = Default, Definition = \"E&xit" #Tag Instance, Platform = Any, Language = de, Definition = \"&Beenden" #Tag Instance, Platform = Any, Language = sv, Definition = \"&Avsluta" #Tag Instance, Platform = Any, Language = fr, Definition = \"Quitter" #tag EndConstant #tag Constant, Name = kFileQuitShortcut, Type = String, Dynamic = False, Default = \"", Scope = Public #Tag Instance, Platform = Mac OS, Language = Default, Definition = \"Cmd+Q" #Tag Instance, Platform = Linux, Language = Default, Definition = \"Ctrl+Q" #tag EndConstant #tag Constant, Name = kLogoPackInstructions, Type = String, Dynamic = True, Default = \"Once you\'ve downloaded the logo\'s pack\x2C put the pictures inside a folder named \"Studios\" in the same location as ViMediaManager or in the following path: \"~/Library/Application Support/ViMediaManager/Studios/\".", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Once you\'ve downloaded the logo\'s pack\x2C put the pictures inside a folder named \"Studios\" in the same location as ViMediaManager or in the following path: \"~/Library/Application Support/ViMediaManager/Studios/\"." #Tag Instance, Platform = Any, Language = nl, Definition = \"Wanneer je de studio logo\'s gedownload hebt\x2C plaats de afbeeldingen in een map genaamd \"Studios\" in de zelfde map als ViMediaManager\x2C of in de volgende locatie: \"~/Library/Application Support/ViMediaManager/Studios/\"." #Tag Instance, Platform = Any, Language = sv, Definition = \"N\xC3\xA4r du har laddat ned logopaketet\x2C placera det i en mapp med namnet \"Studios\" p\xC3\xA5 samma plats som ViMediaManager (normal s\xC3\xB6kv\xC3\xA4g \xC3\xA4r \"~/Library/Application Support/ViMediaManager/Studios/\")." #Tag Instance, Platform = Any, Language = de, Definition = \"Wenn das Logo-Pack heruntergeladen wurde\x2C dann kopiere es in einen Ordner und benenne diesen \'Studios\'. Kopiere diesen in das Verzeichnis in dem der ViMediaManager liegt. Alternativ in folgenden Pfad \'~/Library/Application Support/ViMediaManager/Studios/\'." #Tag Instance, Platform = Any, Language = fr, Definition = \"Quand vous aurez t\xC3\xA9l\xC3\xA9charg\xC3\xA9 le pack de logos\x2C placez les images \xC3\xA0 l\'int\xC3\xA9rieur d\'un dossier nomm\xC3\xA9 \"Studios\" au m\xC3\xAAme endroit que l\'application ViMediaManager ou dans le r\xC3\xA9pertoire \"~/Library/Application Support/ViMediaManager/Studios/\"." #tag EndConstant #tag Constant, Name = XBMCForumURL, Type = String, Dynamic = False, Default = \"http://forum.xbmc.org/showthread.php\?p\x3D886768", Scope = Public #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="DebugMode" Group="Behavior" InitialValue="False" Type="Boolean" #tag EndViewProperty #tag ViewProperty Name="ErrorMessage" Group="Behavior" Type="String" EditorType="MultiLineEditor" #tag EndViewProperty #tag ViewProperty Name="Experimental" Visible=true Group="Behavior" InitialValue="True" Type="Boolean" #tag EndViewProperty #tag ViewProperty Name="ScalingFactor" Group="Behavior" InitialValue="1" Type="Integer" #tag EndViewProperty #tag ViewProperty Name="VersionCurrent" Group="Behavior" Type="String" EditorType="MultiLineEditor" #tag EndViewProperty #tag ViewProperty Name="VersionNew" Group="Behavior" Type="String" EditorType="MultiLineEditor" #tag EndViewProperty #tag EndViewBehavior End Class #tag EndClass \ No newline at end of file +#tag Class Protected Class App Inherits Application #tag Event Sub Close() Preferences.WriteDefaults If SpecialFolder.Temporary.Child( App.Identifier ).Exists Then SpecialFolder.Temporary.Child( App.Identifier ).Delete End Sub #tag EndEvent #tag Event Sub Open() App.DebugMode = Keyboard.AsyncAltKey RegisterMBS HelpAbout.Text = Menu.HelpAbout + " " + App.kAppName Preferences.LoadDefaults Growl.Register // Register growl nc.Register // Register Notification Center 'VersionCurrent = App.ShortVersion.ReplaceAll("v", "Version ") VersionCurrent = str( App.MajorVersion ) + "." + str( App.MinorVersion ) If App.BugVersion > 0 Then VersionCurrent = VersionCurrent + "." + str( App.BugVersion ) If App.StageCode = 2 Then VersionCurrent = VersionCurrent + "β" + str( App.NonReleaseVersion ) If App.StageCode = 1 Then VersionCurrent = VersionCurrent + "α" + str( App.NonReleaseVersion ) #If TargetCocoa Then VersionCurrent = VersionCurrent + "c" #If TargetCarbon Then VersionCurrent = VersionCurrent + "i" 'If Experimental Then VersionCurrent = VersionCurrent + Chr(13) + "Nightly" #If DebugBuild then 'InitializeSparkle("http://localhost/~Vidal/appcast-alpha.xml") // Local testing InitializeSparkle("https://raw.githubusercontent.com/vidalvanbergen/ViMediaManager/gh-pages/appcast-cocoa.xml") // Official Cocoa AppCast #ElseIf TargetCocoa Then InitializeSparkle("https://raw.githubusercontent.com/vidalvanbergen/ViMediaManager/gh-pages/appcast-cocoa.xml") // Official Cocoa AppCast #ElseIf TargetCarbon Then InitializeSparkle("https://raw.githubusercontent.com/vidalvanbergen/ViMediaManager/gh-pages/appcast-intel.xml") // Official Intel AppCast #Else InitializeSparkle("https://raw.githubusercontent.com/vidalvanbergen/ViMediaManager/gh-pages/appcast-alpha.xml") #EndIf If NOT SpecialFolder.Temporary.Child( App.Identifier ).Exists Then SpecialFolder.Temporary.Child( App.Identifier ).CreateAsFolder End Sub #tag EndEvent #tag Event Function UnhandledException(error As RuntimeException) As Boolean dlgProgress.Close Dim w as New wndBugReporter w.Init( error, "Unknown (caught at app level)" + chr(13) + ErrorMessage ) Return True End Function #tag EndEvent #tag MenuHandler Function EditPreferences() As Boolean Handles EditPreferences.Action wndPreferences.Show Return True End Function #tag EndMenuHandler #tag MenuHandler Function FileQuit() As Boolean Handles FileQuit.Action Quit Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpAbout() As Boolean Handles HelpAbout.Action wndAbout.Show Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpCheckforUpdates() As Boolean Handles HelpCheckforUpdates.Action Sparkle.checkForUpdates Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpContactAuthor() As Boolean Handles HelpContactAuthor.Action ShowURL "mailto:vimediamanager@gmail.com?subject=ViMediaManager Contact Author" Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpDonate() As Boolean Handles HelpDonate.Action ShowURL DonationURL Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpDownloadStudioLogosets() As Boolean Handles HelpDownloadStudioLogosets.Action MsgBox Loc.kInstructions + chr(13) + chr(13) + kLogoPackInstructions ShowURL ( "http://forum.xbmc.org/showthread.php?t=100652" ) ShowURL ( "http://forum.xbmc.org/showthread.php?t=99554" ) Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpRequest() As Boolean Handles HelpRequest.Action Dim Experiment as String If Experimental Then Experiment = " Nightly" ShowURL "mailto:vimediamanager@gmail.com?subject=ViMediaManager Request Help (v" + VersionCurrent + Experiment + ")" Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpSuggestion() As Boolean Handles HelpSuggestion.Action Dim Experiment as String If Experimental Then Experiment = " Nightly" ShowURL "mailto:vimediamanager@gmail.com?subject=ViMediaManager Suggestion (v" + VersionCurrent + Experiment + ")" Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpVisitKodiForumThread() As Boolean Handles HelpVisitKodiForumThread.Action ShowURL XBMCForumURL Return True End Function #tag EndMenuHandler #tag MenuHandler Function HelpVisitWebsite() As Boolean Handles HelpVisitWebsite.Action ShowURL "http://vidalvanbergen.github.com/ViMediaManager/" Return True End Function #tag EndMenuHandler #tag MenuHandler Function WindowBringAlltoFront() As Boolean Handles WindowBringAlltoFront.Action For i as Integer = WindowCount - 1 DownTo 0 Window( WindowCount - 1 ).Show Next Return True End Function #tag EndMenuHandler #tag Method, Flags = &h21 Private Function HandleSparkleCancelQuit() As Boolean Return True End Function #tag EndMethod #tag Method, Flags = &h21 Private Sub HandleSparkleFoundVersion(isNew as Boolean, version as String) Dim Major, Minor, Bug, Stage, NonRelease As Integer = 0 Dim VersionPart() as String = Version.Split(".") If VersionPart.Ubound = -1 then Return Major = Val( VersionPart(0) ) If VersionPart.Ubound >= 1 then Minor = Val( VersionPart(1) ) If VersionPart.Ubound >= 2 then Bug = Val( VersionPart(2) ) If VersionPart.Ubound >= 3 then Stage = Val( VersionPart(3) ) If VersionPart.Ubound >= 4 then NonRelease = Val( VersionPart(4) ) VersionNew = str( Major ) + "." + str( Minor ) If Bug > 0 then VersionNew = VersionNew + "." + str( Bug ) If Stage = 2 Then VersionNew = VersionNew + "β" + str( NonRelease ) If Stage = 1 Then VersionNew = VersionNew + "α" + str( NonRelease ) VersionNew = Version End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub InitializeSparkle(FeedURL as String) Dim SparkleFramework as FolderItem = App.ApplicationBundle.Child("Contents").Child("Frameworks").Child("Sparkle.framework") if NOT SUUpdaterMBS.LoadFramework( SparkleFramework ) then Log "Failed to load sparkle framework", 2 Return // Exit end if Sparkle = New SUUpdaterMBS Sparkle.feedURL = FeedURL dim d as Date = Sparkle.lastUpdateCheckDate if d = Nil then Sparkle.automaticallyChecksForUpdates = True end if if Sparkle.automaticallyChecksForUpdates then Sparkle.checkForUpdatesInBackground end if Exception err as NSExceptionMBS Log "Sparkle Update Failed, " + err.Message, 2 End Sub #tag EndMethod #tag Property, Flags = &h0 DebugMode As Boolean = False #tag EndProperty #tag Property, Flags = &h0 ErrorMessage As String #tag EndProperty #tag Property, Flags = &h0 Experimental As Boolean = False #tag EndProperty #tag Property, Flags = &h0 ScalingFactor As Integer = 1 #tag EndProperty #tag Property, Flags = &h0 Sparkle As SUUpdaterMBS #tag EndProperty #tag Property, Flags = &h0 VersionCurrent As String #tag EndProperty #tag Property, Flags = &h0 VersionNew As String #tag EndProperty #tag Constant, Name = Category, Type = String, Dynamic = False, Default = \"Video", Scope = Public #tag EndConstant #tag Constant, Name = DonationURL, Type = String, Dynamic = False, Default = \"https://www.paypal.com/cgi-bin/webscr\?cmd\x3D_donations&business\x3Dvidal%2evanbergen%40gmail%2ecom&lc\x3DGB&item_name\x3DSupport%20ViMediaManager%20development¤cy_code\x3DEUR&bn\x3DPP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted", Scope = Public #tag EndConstant #tag Constant, Name = Identifier, Type = String, Dynamic = False, Default = \"com.vidalvanbergen.vimediamanager-alpha", Scope = Public #tag EndConstant #tag Constant, Name = kAppName, Type = String, Dynamic = False, Default = \"ViMediaManager", Scope = Public #tag EndConstant #tag Constant, Name = kEditClear, Type = String, Dynamic = False, Default = \"&Delete", Scope = Public #Tag Instance, Platform = Windows, Language = Default, Definition = \"&Delete" #Tag Instance, Platform = Linux, Language = Default, Definition = \"&Delete" #tag EndConstant #tag Constant, Name = kFileQuit, Type = String, Dynamic = True, Default = \"&Quit", Scope = Public #Tag Instance, Platform = Windows, Language = Default, Definition = \"E&xit" #Tag Instance, Platform = Any, Language = de, Definition = \"&Beenden" #Tag Instance, Platform = Any, Language = sv, Definition = \"&Avsluta" #Tag Instance, Platform = Any, Language = fr, Definition = \"Quitter" #tag EndConstant #tag Constant, Name = kFileQuitShortcut, Type = String, Dynamic = False, Default = \"", Scope = Public #Tag Instance, Platform = Mac OS, Language = Default, Definition = \"Cmd+Q" #Tag Instance, Platform = Linux, Language = Default, Definition = \"Ctrl+Q" #tag EndConstant #tag Constant, Name = kLogoPackInstructions, Type = String, Dynamic = True, Default = \"Once you\'ve downloaded the logo\'s pack\x2C put the pictures inside a folder named \"Studios\" in the same location as ViMediaManager or in the following path: \"~/Library/Application Support/ViMediaManager/Studios/\".", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Once you\'ve downloaded the logo\'s pack\x2C put the pictures inside a folder named \"Studios\" in the same location as ViMediaManager or in the following path: \"~/Library/Application Support/ViMediaManager/Studios/\"." #Tag Instance, Platform = Any, Language = nl, Definition = \"Wanneer je de studio logo\'s gedownload hebt\x2C plaats de afbeeldingen in een map genaamd \"Studios\" in de zelfde map als ViMediaManager\x2C of in de volgende locatie: \"~/Library/Application Support/ViMediaManager/Studios/\"." #Tag Instance, Platform = Any, Language = sv, Definition = \"N\xC3\xA4r du har laddat ned logopaketet\x2C placera det i en mapp med namnet \"Studios\" p\xC3\xA5 samma plats som ViMediaManager (normal s\xC3\xB6kv\xC3\xA4g \xC3\xA4r \"~/Library/Application Support/ViMediaManager/Studios/\")." #Tag Instance, Platform = Any, Language = de, Definition = \"Wenn das Logo-Pack heruntergeladen wurde\x2C dann kopiere es in einen Ordner und benenne diesen \'Studios\'. Kopiere diesen in das Verzeichnis in dem der ViMediaManager liegt. Alternativ in folgenden Pfad \'~/Library/Application Support/ViMediaManager/Studios/\'." #Tag Instance, Platform = Any, Language = fr, Definition = \"Quand vous aurez t\xC3\xA9l\xC3\xA9charg\xC3\xA9 le pack de logos\x2C placez les images \xC3\xA0 l\'int\xC3\xA9rieur d\'un dossier nomm\xC3\xA9 \"Studios\" au m\xC3\xAAme endroit que l\'application ViMediaManager ou dans le r\xC3\xA9pertoire \"~/Library/Application Support/ViMediaManager/Studios/\"." #tag EndConstant #tag Constant, Name = XBMCForumURL, Type = String, Dynamic = False, Default = \"http://forum.xbmc.org/showthread.php\?p\x3D886768", Scope = Public #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="DebugMode" Group="Behavior" InitialValue="False" Type="Boolean" #tag EndViewProperty #tag ViewProperty Name="ErrorMessage" Group="Behavior" Type="String" EditorType="MultiLineEditor" #tag EndViewProperty #tag ViewProperty Name="Experimental" Visible=true Group="Behavior" InitialValue="True" Type="Boolean" #tag EndViewProperty #tag ViewProperty Name="ScalingFactor" Group="Behavior" InitialValue="1" Type="Integer" #tag EndViewProperty #tag ViewProperty Name="VersionCurrent" Group="Behavior" Type="String" EditorType="MultiLineEditor" #tag EndViewProperty #tag ViewProperty Name="VersionNew" Group="Behavior" Type="String" EditorType="MultiLineEditor" #tag EndViewProperty #tag EndViewBehavior End Class #tag EndClass \ No newline at end of file diff --git a/ViMM/Build Automation.rbbas b/ViMM/Build Automation.rbbas old mode 100755 new mode 100644 diff --git a/ViMM/Classes/SearchBar/ccSearch.rbfrm b/ViMM/Classes/SearchBar/ccSearch.rbfrm old mode 100755 new mode 100644 diff --git a/ViMM/Classes/ccCancelSave.rbfrm b/ViMM/Classes/ccCancelSave.rbfrm old mode 100755 new mode 100644 diff --git a/ViMM/Classes/ccThumbView.rbfrm b/ViMM/Classes/ccThumbView.rbfrm old mode 100755 new mode 100644 diff --git a/ViMM/CoreServices/MovieCore.rbbas b/ViMM/CoreServices/MovieCore.rbbas old mode 100755 new mode 100644 diff --git a/ViMM/CoreServices/MovieSckt.rbbas b/ViMM/CoreServices/MovieSckt.rbbas old mode 100755 new mode 100644 index ba3ebe1..886cec1 --- a/ViMM/CoreServices/MovieSckt.rbbas +++ b/ViMM/CoreServices/MovieSckt.rbbas @@ -1 +1 @@ -#tag Class Protected Class MovieSckt Inherits HTTPSocket #tag Event Sub Error(code as integer) If CommonCore.MassSearch Then CommonCore.UnfoundTitles.Append "HTTP Error: " + str(code) + " occured." CommonCore.UnfoundPaths.Append MovieAttr.FolderParent End If SocketError( code, Me ) Exception err as NilObjectException Me.Close End Sub #tag EndEvent #tag Event Sub ReceiveProgress(bytesReceived as integer, totalBytes as integer, newData as string) Dim Progress as String = BytesToString( bytesReceived ) + Loc.k1of2 + BytesToString( totalBytes ) dlgProgress.Debug( Progress ) End Sub #tag EndEvent #tag Method, Flags = &h0 Sub GetArt(ID as String, Title as String) Dim Info as String = "GetArt( " + ID + ", " + Title + " ) - " Dim Sckt as New MovieSckt Dim JSONString as String Dim CacheID as String = MovieAttr.ID_IMDB If CacheID = "" Then CacheID = MovieAttr.ID_TMDB Dim Lang as String = Prefs.stringForKey("DBLanguage") If Lang = "gb" Then Lang = "en" Dim TimeOut as Integer = Prefs.integerForKey("TimeOut") Dim Count as Integer = 1 If NOT CommonCore.MassSearch Then dlgProgress.Reset Else Count = -1 End If Dim bFanartTV as Boolean = Prefs.boolForKey("AutoDownloadClearArt") Or _ Prefs.boolForKey("AutoDownloadLogo") Or _ Prefs.boolForKey("AutoDownloadDiscArt") Or _ Prefs.boolForKey("AutoDownloadThumb") Or _ Prefs.boolForKey("AutoDownloadBanner") Or _ Prefs.boolForKey("AutoDownloadBackdrop") If NOT Prefs.boolForKey("FanartTVEnabled") Then bFanartTV = False Dim bTMDB as Boolean = Prefs.boolForKey("AutoDownloadBackdrop") OR Prefs.boolForKey("AutoDownloadPoster") // :1 ## Get TMDB Info App.ErrorMessage = Info + "Get TMDB Info" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", "[TMDB] " + Loc.kImages.Titlecase + " " + Loc.kReadingInfo.Lowercase + "...", Count, 12 ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kImages + " " + Loc.mTabInfo.Lowercase + "..." ) End If If bTMDB Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieImages", ID, Lang ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim TMDB_Art as New JSONItem If bTMDB And JSONString.ValidJSON( "TMDB Art" ) Then TMDB_Art.Load( JSONString ) JSONString = "" Dim TMDB_Backdrops as New JSONItem Dim TMDB_Posters as New JSONItem If TMDB_Art <> Nil And TMDB_Art.HasName("backdrops") Then TMDB_Backdrops = TMDB_Art.Child("backdrops") If TMDB_Art <> Nil And TMDB_Art.HasName("posters") Then TMDB_Posters = TMDB_Art.Child("posters") Count = Count +1 // :2 ## FanartTV If bFanartTV Then App.ErrorMessage = Info + "Get FanartTV Info" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", "[Fanart.TV] " + Loc.kImages.Titlecase + " " + Loc.kReadingInfo.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kImages + " " + Loc.mTabInfo.Lowercase + "..." ) End If If bFanartTV Then JSONString = Trim( DefineEncoding( Sckt.Get( URLCore.FanartTV( ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) Sckt.Close 'If JSONString <> "" Then 'Dim FirstBracketLoc as Integer = JSONString.InStr( 2, "{" ) 'JSONString = JSONString.Right( JSONString.Len - FirstBracketLoc + 1) 'End If Dim FanartTV as New JSONItem If bFanartTV And JSONString.ValidJSON( "FanartTV" ) Then FanartTV.Load( JSONString ) JSONString = "" Dim FanartTV_Logos as New JSONItem Dim FanartTV_HDLogos as New JSONItem Dim FanartTV_ClearArt as New JSONItem Dim FanartTV_HDClearArt as New JSONItem Dim FanartTV_Thumb as New JSONItem Dim FanartTV_Banner as New JSONItem Dim FanartTV_Disc as New JSONItem Dim FanartTV_Fanart as New JSONItem If FanartTV.HasName("movielogo") Then FanartTV_Logos = FanartTV.Child("movielogo") If FanartTV.HasName("hdmovielogo") Then FanartTV_HDLogos = FanartTV.Child("hdmovielogo") If FanartTV.HasName("movieart") Then FanartTV_ClearArt = FanartTV.Child("movieart") If FanartTV.HasName("hdmovieclearart") Then FanartTV_HDClearArt = FanartTV.Child("hdmovieclearart") If FanartTV.HasName("moviethumb") Then FanartTV_Thumb = FanartTV.Child("moviethumb") If FanartTV.HasName("moviebanner") Then FanartTV_Banner = FanartTV.Child("moviebanner") If FanartTV.HasName("moviedisc") Then FanartTV_Disc = FanartTV.Child("moviedisc") If FanartTV.HasName("moviebackground") Then FanartTV_Fanart = FanartTV.Child("moviebackground") Count = Count +1 // :3 ## Posters App.ErrorMessage = Info + "Get TMDb Posters" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kPoster + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kPoster + " " + Loc.kImage.Lowercase + "..." ) End If If TMDB_Posters <> Nil Then Dim FirstPosterURL as String For i as Integer = 0 to TMDB_Posters.Count -1 Dim jItem as New JSONItem jItem = TMDB_Posters.Child(i) If jItem.Value("file_path") = "" Then Continue If FirstPosterURL = "" And ( jItem.Value("iso_639_1") = Lang OR jItem.Value("iso_639_1") = "" ) Then FirstPosterURL = URLbase_image + Prefs.stringForKey( "PosterSize" ) + jItem.Value("file_path") End If MovieAttr.ART_PosterURLs.Append URLbase_image + "original" + jItem.Value("file_path") MovieAttr.ART_PosterThumbURLs.Append URLbase_image + "w92" + jItem.Value("file_path") MovieAttr.ART_PosterDimensions.Append jItem.Value("width") + "x" + jItem.Value("height") Next // First Poster Dim DestPoster as FolderItem = MovieAttr.DestinationPoster( MovieAttr.FolderParent ) If FirstPosterURL = "" And MovieAttr.ART_PosterURLs.Ubound > -1 Then FirstPosterURL = MovieAttr.ART_PosterURLs(0) If Prefs.boolForKey("AutoDownloadPoster") And FirstPosterURL <> "" And DestPoster <> Nil And NOT DestPoster.Exists Then MovieAttr.ART_Poster = URL2Picture( FirstPosterURL, DestPoster.Parent, DestPoster.Name ) CacheImageSet( MovieAttr.ART_Poster, CacheID + ".movie.poster.jpg" ) End If End If Count = Count + 1 // :4 ## Backdrops App.ErrorMessage = Info + "Get TMDb Backdrops" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kFanart + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kFanart + " " + Loc.kImage.Lowercase + "..." ) End If // TMDB Fanarts Dim FirstBackdropURL as String If TMDB_Backdrops <> Nil Then For i as Integer = 0 to TMDB_Backdrops.Count -1 Dim jItem as New JSONItem jItem = TMDB_Backdrops.Child(i) If jItem.Value("file_path") = "" Then Continue If FirstBackdropURL = "" And ( jItem.Value("iso_639_1") = Lang OR jItem.Value("iso_639_1") = "" ) Then FirstBackdropURL = URLbase_image + Prefs.stringForKey( "FanartSize" ) + jItem.Value("file_path") End If MovieAttr.ART_FanartURLs.Append URLbase_image + "original" + jItem.Value("file_path") MovieAttr.ART_FanartThumbURLs.Append URLbase_image + "w300" + jItem.Value("file_path") MovieAttr.ART_FanartDimensions.Append jItem.Value("width") + "x" + jItem.Value("height") Next End If // FanartTV Fanarts App.ErrorMessage = Info + "Get FanartTV Fanarts" If FanartTV_Fanart <> Nil Then For i as Integer = 0 to FanartTV_Fanart.Count -1 MovieAttr.ART_FanartURLs.Append FanartTV_Fanart.Child(i).Value("url") MovieAttr.ART_FanartThumbURLs.Append FanartTV_Fanart.Child(i).Value("url") + "/preview" MovieAttr.ART_FanartDimensions.Append "1920x1080" Next End If // First Fanart Dim DestFanart as FolderItem = MovieAttr.DestinationFanart( MovieAttr.FolderParent ) If FirstBackdropURL= "" And MovieAttr.ART_FanartURLs.Ubound > -1 Then FirstBackdropURL = MovieAttr.ART_FanartURLs(0) If Prefs.boolForKey("AutoDownloadBackdrop") And FirstBackdropURL <> "" And DestFanart <> Nil And NOT DestFanart.Exists Then MovieAttr.ART_Poster = URL2Picture( FirstBackdropURL, DestFanart.Parent, DestFanart.Name ) CacheImageSet( MovieAttr.ART_Poster, CacheID + ".movie.fanart.jpg" ) End If Count = Count + 1 // :5 ## First Logo App.ErrorMessage = Info + "Get Logos" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kLogo + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kLogo + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadLogo") And NOT MovieAttr.FolderParent.Child("logo.png").Exists Then Dim FirstLogo as String if FanartTV_HDLogos <> Nil And FanartTV_HDLogos.Count > 0 Then For i as Integer = 0 to FanartTV_HDLogos.Count -1 If FirstLogo = "" And FanartTV_HDLogos.Child(i).Value("lang") = Lang Then FirstLogo = FanartTV_HDLogos.Child(i).Value("url") Next 'if FirstLogo = "" Then FirstLogo = FanartTV_HDLogos.Child(0).Value("url") End If If FanartTV_Logos <> Nil And FanartTV_Logos.Count > 0 Then For i as Integer = 0 to FanartTV_Logos.Count -1 If FirstLogo = "" And FanartTV_Logos.Child(i).Value("lang") = Lang Then FirstLogo = FanartTV_Logos.Child(i).Value("url") Next End If 'If FirstLogo = "" Then FirstLogo = FanartTV_Logos.Child(0).Value("url") If FirstLogo = "" And FanartTV_HDLogos <> Nil And FanartTV_HDLogos.Count > 0 Then FirstLogo = FanartTV_HDLogos.Child(0).Value("url") If FirstLogo = "" And FanartTV_Logos <> Nil And FanartTV_Logos.Count > 0 Then FirstLogo = FanartTV_Logos.Child(0).Value("url") If FirstLogo <> "" Then URL2Picture( FirstLogo, MovieAttr.FolderParent, "logo.png" ) End If Count = Count + 1 // :6 ## First ClearArt App.ErrorMessage = Info + "Get ClearArt" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kClearArt + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kClearArt + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadClearArt") And NOT MovieAttr.FolderParent.Child("clearart.png").Exists Then Dim FirstClearArt as String If FanartTV_HDClearArt <> Nil And FanartTV_HDClearArt.Count > 0 Then For i as Integer = 0 to FanartTV_HDClearArt.Count -1 If FirstClearArt = "" And FanartTV_HDClearArt.Child(i).Value("lang") = Lang Then FirstClearArt = FanartTV_HDClearArt.Child(i).Value("url") Next End If If FirstClearArt = "" And FanartTV_ClearArt <> Nil And FanartTV_ClearArt.Count > 0 Then For i as Integer = 0 to FanartTV_ClearArt.Count -1 If FirstClearArt = "" And FanartTV_ClearArt.Child(i).Value("lang") = Lang Then FirstClearArt = FanartTV_ClearArt.Child(i).Value("url") Next 'If FirstClearArt = "" Then FirstClearArt = FanartTV_ClearArt.Child(0).Value("url") End If If FirstClearArt = "" And FanartTV_HDClearArt <> Nil And FanartTV_HDClearArt.Count > 0 Then FirstClearArt = FanartTV_HDClearArt.Child(0).Value("url") If FirstClearArt = "" And FanartTV_ClearArt <> Nil And FanartTV_ClearArt.Count > 0 Then FirstClearArt = FanartTV_ClearArt.Child(0).Value("url") If FirstClearArt <> "" Then URL2Picture( FirstClearArt, MovieAttr.FolderParent, "clearart.png" ) End If Count = Count + 1 // :7 ## First Thumb App.ErrorMessage = Info + "Get Thumb" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kThumb + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kThumb + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadThumb") And NOT MovieAttr.FolderParent.Child("landscape.jpg").Exists Then Dim FirstThumb as String If FanartTV_Thumb <> Nil And FanartTV_Thumb.Count > 0 Then For i as Integer = 0 to FanartTV_Thumb.Count -1 If FirstThumb = "" And FanartTV_Thumb.Child(i).Value("lang") = Lang Then FirstThumb = FanartTV_Thumb.Child(i).Value("url") Next If FirstThumb = "" Then FirstThumb = FanartTV_Thumb.Child(0).Value("url") End If If FirstThumb <> "" Then URL2Picture( FirstThumb, MovieAttr.FolderParent, "landscape.jpg" ) End If Count = Count + 1 // :8 ## First Banner App.ErrorMessage = Info + "Get Banner" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kBanner + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kBanner + " " + Loc.kImage.Lowercase + "..." ) End If Dim BannerFile as FolderItem = FindImageBanner( MovieAttr.FolderParent ) If BannerFile = Nil Then BannerFile = MovieAttr.DestinationBanner( MovieAttr.FolderParent ) If Prefs.boolForKey("AutoDownloadBanner") And NOT BannerFile.Exists Then Dim FirstBanner as String If FanartTV_Banner <> Nil And FanartTV_Banner.Count > 0 Then For i as Integer = 0 to FanartTV_Banner.Count -1 If FirstBanner = "" And FanartTV_Banner.Child(i).Value("lang") = Lang Then FirstBanner = FanartTV_Banner.Child(i).Value("url") Next If FirstBanner = "" Then FirstBanner = FanartTV_Banner.Child(0).Value("url") End If If FirstBanner <> "" Then URL2Picture( FirstBanner, BannerFile.Parent, BannerFile.Name ) End If Count = Count + 1 // :9 ## First Disc App.ErrorMessage = Info + "Get DiscArt" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kDiscArt + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kDiscArt + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadDiscArt") And NOT MovieAttr.FolderParent.Child("disc.png").Exists Then Dim FirstDisc as String If FanartTV_Disc <> Nil And FanartTV_Disc.Count > 0 Then For i as Integer = 0 to FanartTV_Disc.Count -1 If FirstDisc = "" And FanartTV_Disc.Child(i).Value("lang") = Lang Then FirstDisc = FanartTV_Disc.Child(i).Value("url") Next If FirstDisc = "" Then FirstDisc = FanartTV_Disc.Child(0).Value("url") End If If FirstDisc <> "" Then URL2Picture( FirstDisc, MovieAttr.FolderParent, "disc.png" ) End If Count = Count + 1 // :10 ## ExtraThumbs App.ErrorMessage = Info + "Get ExtraThumbs" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kExtraThumbs + " " + Loc.kImages.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kExtraThumbs + " " + Loc.kImages.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadExtraThumbs") And MovieAttr.FolderParent <> Nil ANd MovieAttr.FolderParent.Exists And MovieAttr.FolderParent.IsWriteable And NOT MovieAttr.FolderParent.FolderError Then Dim Destination as FolderItem = MovieAttr.FolderParent.Child("extrathumbs") If NOT Destination.Exists And DestFanart.IsWriteable And NOT DestFanart.FolderError Then Destination.CreateAsFolder Dim n as Integer = 0 Dim Total as Integer = 0 If Destination <> Nil And Destination.Exists And MovieAttr.ART_FanartURLs <> Nil And MovieAttr.ART_FanartURLs.Ubound > -1 Then For i as Integer = 0 to MovieAttr.ART_FanartURLs.Ubound If MovieAttr.ART_FanartURLs(i).InStr( 0, "original" ) > 0 Then Total = Total + 1 Next For i as Integer = 0 to MovieAttr.ART_FanartURLs.Ubound If Prefs.integerForKey( "MaxThumbs" ) > 0 And i = Prefs.integerForKey( "MaxThumbs" ) Then Exit Dim Max as Integer = MovieAttr.ART_FanartURLs.Ubound + 1 If Prefs.integerForKey( "MaxThumbs" ) > 0 And Prefs.integerForKey( "MaxThumbs" ) < Max Then Max = Prefs.integerForKey( "MaxThumbs" ) If i > Max Then Exit dlgProgress.Debug( Str( i + 1 ) + Loc.k1of2 + Str( Max ) + " " + Loc.kExtraThumbs + "..." ) If MovieAttr.ART_FanartURLs(i).InStr( 0, "original" ) = 0 Then Continue n = n + 1 If Destination.Child( "thumb" + str(n) + ".jpg" ).Exists Then Continue If MovieAttr.ART_FanartURLs.Ubound > -1 Then URL2Picture( MovieAttr.ART_FanartURLs(i).ReplaceAll("original", "w780"), Destination, "thumb" + Str(n) + ".jpg" ) Next End If End If Count = Count + 1 // :11 ## ExtraFanart App.ErrorMessage = Info + "Get ExtraFanart" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kExtraFanarts + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kExtraFanarts + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadExtraFanart") Then Dim Destination as FolderItem = MovieAttr.FolderParent.Child("extrafanart") If NOT Destination.Exists Then Destination.CreateAsFolder If Destination <> Nil And Destination.Exists And MovieAttr.ART_FanartURLs <> Nil And MovieAttr.ART_FanartURLs.Ubound > -1 Then Dim Max as Integer = MovieAttr.ART_FanartURLs.Ubound + 1 If Prefs.integerForKey( "MaxBackdrops" ) > 0 And Prefs.integerForKey( "MaxBackdrops") < Max Then Max = Prefs.integerForKey( "MaxBackdrops" ) For i as Integer = 0 to MovieAttr.ART_FanartURLs.Ubound If i >= Max Then Exit dlgProgress.Debug( Str( i + 1 ) + Loc.k1of2 + Str( Max ) + " " + Loc.kExtraFanarts + "..." ) Dim Name() as String = MovieAttr.ART_FanartURLs(i).Split("/") If Name.Ubound = -1 Then Continue Dim FileName as String = Name( Name.Ubound ) If Destination.Child( FileName ).Exists Then Continue If MovieAttr.ART_FanartURLs.Ubound >= i Then URL2Picture( MovieAttr.ART_FanartURLs(i).ReplaceAll( "original", Prefs.stringForKey( "FanartSize" ) ), Destination ) Next End If End If End If // @END bFanartTV = True dlgProgress.Debug( "" ) App.ErrorMessage = "" End Sub #tag EndMethod #tag Method, Flags = &h0 Sub GetMovieNFO(ID as String, Update as Boolean = False) #pragma DisableBackgroundTasks #If NOT DebugBuild Then #pragma DisableBoundsChecking #pragma NilObjectChecking False #pragma StackOverflowChecking False #endif Dim Sckt as New MovieSckt Sckt.Yield = True 'Sckt.Anonymouse Dim rand as New Random Dim IP as String = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) Sckt.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) Sckt.SetRequestHeader( "User-agent", "Mozilla/" + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,3) ) + " (Windows NT " + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,2) ) + "; rv:2.0.1) Gecko/20100101 Firefox/" + Str( rand.InRange(3,5) ) + ".0.1" ) Dim MovieInfo as String = CurrentItemName + " " + Loc.mTabInfo.Lowercase + "..." // Temporary Save Dim PrevTitle, PrevTitleSort, PrevTitleOriginal, PrevSet, PrevSetOrder, PrevTagline, PrevRipSource as String dim prevGenres(), prevTags() as string Dim PrevWatchedStatus as Boolean = MovieAttr.StatusWatched App.ErrorMessage = "Update: " + Str( Update ) + " - Resetting properties." If Update Then PrevTitle = MovieAttr.Title PrevTitleSort = MovieAttr.TitleSort PrevTitleOriginal = MovieAttr.TitleOriginal PrevTagline = MovieAttr.DescriptionTagline for each genre as string in MovieAttr.Genres prevGenres.Append genre next for each tag as string in MovieAttr.Tags prevTags.Append tag next PrevSet = MovieAttr.Set PrevSetOrder = Str( MovieAttr.SetOrder ) PrevWatchedStatus = MovieAttr.StatusWatched PrevRipSource = MovieAttr.RipSource End If MovieAttr.ClearProperties If Update Then MovieAttr.Title = PrevTitle MovieAttr.TitleSort = PrevTitleSort MovieAttr.TitleOriginal = PrevTitleOriginal MovieAttr.DescriptionTagline = PrevTagline MovieAttr.Genres = PrevGenres MovieAttr.Set = PrevSet MovieAttr.SetOrder = Val( PrevSetOrder ) MovieAttr.StatusWatched = PrevWatchedStatus MovieAttr.RipSource = PrevRipSource MovieAttr.Tags = PrevTags End If If NOT CommonCore.MassSearch Then dlgProgress.Reset App.ErrorMessage = "Update: " + Str( Update ) + " - Fathering Info" // ## Gathering Info Dim Lang as String = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) Dim TimeOut as Integer = Prefs.integerForKey("TimeOut") / 2 Dim JSONString as String = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb U.S." // :1 ## TMDB U.S. Info If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb] " + MovieInfo, 1, 20 ) Else dlgProgress.Debug( "[TMDb] " + MovieInfo ) JSONString = DefineEncoding( Sckt.Get( URL( "MovieInfo", ID, "en" ), TimeOut ), Encodings.UTF8 ) Sckt.Close // Got a valid response from TMDb? Dim TMDBValid as Boolean = ( JSONString.InStr( 0, "Invalid id - The pre-requisite id is invalid or not found" ) = 0 AND JSONString <> "" ) Dim TMDB_US as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb - Info" ) Then TMDB_US.Load( JSONString ) JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Localized: " + Lang // :2 ## TMDB Localized Info If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb Localised] " + MovieInfo ) Else dlgProgress.Debug( "[TMDb Localised] " + MovieInfo ) If TMDBValid And Lang <> "en" Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieInfo", ID, Lang ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim TMDB_Local as New JSONItem If TMDBValid And Lang <> "en" And JSONString.ValidJSON( "TMDb - Localised", True ) Then TMDB_Local.Load( JSONString ) JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Alternative Titles" // :3 ## TMDB Alternative Titles If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb Alt-Titles] " + MovieInfo ) Else dlgProgress.Debug( "[TDMB Alt-Titles] " + MovieInfo ) If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieAlternativeTitles", ID, "en" ), TimeOut), Encodings.UTF8 ) Sckt.Close Dim TMDB_AltTitles as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb Alt-Titles" ) Then TMDB_AltTitles.Load( JSONString ) JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Cast" // :4 ## TMDB Cast If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb Cast] " + MovieInfo ) Else dlgProgress.Debug( "[TMDb Cast] " + MovieInfo ) If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieCast", ID, "en" ), TimeOut), Encodings.UTF8 ) Sckt.Close Dim TMDB_Cast as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb Cast" ) Then TMDB_Cast.Load( JSONString ) JSONString = "" // :5 ## TMDb Images App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Releases" // :6 ## TMDb Releases If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb Releases] " + MovieInfo ) Else dlgProgress.Debug( "[TMDb Releases] " + MovieInfo ) If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieReleases", ID, "en" ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim TMDB_Releases as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb Releases" ) Then TMDB_Releases.Load( JSONString ) JSONString = "" // :7 ## TMDB Trailers 'If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDB Trailers] " + MovieInfo ) Else dlgProgress.Debug( "[TMDB Trailers] " + MovieInfo ) 'If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieTrailers", ID, "en" ), TimeOut ), Encodings.UTF8 ) 'Sckt.Close ' 'Dim TMDB_Trailers as New JSONItem 'If TMDBValid And JSONString.ValidJSON( "TMDB Trailers" ) Then TMDB_Trailers.Load( JSONString ) 'JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - IMDb" // :8 ## IMDb If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[IMDb] " + MovieInfo ) Else dlgProgress.Debug( "[IMDb] " + MovieInfo ) Dim IMDbID as String = ID If TMDB_US.HasName("imdb_id") Then IMDbID = TMDB_US.Value("imdb_id") Dim IMDb as New JSONItem If IMDbID.Left(2) = "tt" Then IMDb = GetIMDbJSON( IMDbID ) Dim Tomatoes as New JSONItem If Prefs.boolForKey("RTEnabled") Then App.ErrorMessage = "Update: " + Str( Update ) + " - Rotten Tomatoes" // :9 ## Rotten Tomatoes If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[Rotten Tomatoes] " + MovieInfo ) Else dlgProgress.Debug( "[Rotten Tomatoes] " + MovieInfo ) If IMDbID.Left(2) = "tt" Then JSONString = Trim( DefineEncoding( Sckt.Get( URLCore.RottenTomatoes( IMDbID.ReplaceAll( "tt", "" ), "Alias" ), TimeOut ), Encodings.UTF8 ) ) Sckt.Close If JSONString <> "" and JSONString.Left(1) = "{" Then 'Dim FirstBracketLoc as Integer = JSONString.InStr(0, "{" ) 'JSONString = Trim( JSONString.Right( JSONString.Len - FirstBracketLoc + 1) ) If JSONString.ValidJSON( "Rotten Tomatoes" ) Then Tomatoes.Load( JSONString ) End If End If JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - Recommendations" // :10 ## Recommendations If Prefs.stringForKey("MediaPlayer") <> "YAMJ" And Prefs.boolForKey("GetRecommendations") Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[" + Loc.kRecMovies + "] " + MovieInfo ) Else dlgProgress.Debug( "[" + Loc.kRecMovies + "] " + MovieInfo ) If Prefs.boolForKey("RTEnabled") And Prefs.boolForKey("RTRecsEnabled") Then App.ErrorMessage = "Update: " + Str( Update ) + " - RottenTomatoes Recommendations" // RottenTomatoes If Tomatoes <> Nil And Tomatoes.HasName("id") And Tomatoes.Value("id") <> "" Then dlgProgress.Debug( "Rotten Tomatoes " + Loc.kRecMovies + "..." ) JSONString = DefineEncoding( Sckt.Get( URLCore.RottenTomatoes( Tomatoes.Value("id"), "Recommendations" ), TimeOut), Encodings.UTF8 ) Sckt.Close Dim TomatoesRecommendations as New JSONItem If JSONString.ValidJSON("RT Recommendations") Then TomatoesRecommendations.Load( JSONString ) JSONString = "" If TomatoesRecommendations <> Nil And TomatoesRecommendations.HasName("movies") Then For i as Integer = 0 to TomatoesRecommendations.Child("movies").Count -1 Dim jItem as New JSONItem jItem = TomatoesRecommendations.Child("movies").Child(i) If jItem.HasName("title") And jItem.HasName("alternate_ids") And jItem.Child("alternate_ids").HasName("imdb") Then MovieAttr.RecMovies.Append jItem.Value("title") MovieAttr.RecMoviesIDs.Append "tt" + jItem.Child("alternate_ids").Value("imdb")' + " RottenTomatoes" MovieAttr.RecMoviesSources.Append "RottenTomatoes" End If Next End If End If End If App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Recommendations" // TMDB Recommendations If Prefs.integerForKey("TMDBRecommendations") > -1 Then If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieRecommendations", ID, Lang ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim TMDB_Recommendations As New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb Recommendations" ) Then TMDB_Recommendations.Load( JSONString ) JSONString = "" Dim Pages as Integer = -1 If TMDB_Recommendations.HasName("total_pages") Then Pages = TMDB_Recommendations.Value("total_pages") If Prefs.integerForKey("TMDBRecommendations") <> 0 And Pages > Prefs.integerForKey("TMDBRecommendations") Then Pages = Prefs.integerForKey("TMDBRecommendations") dlgProgress.Debug( "1" + Loc.k1of2 + Str( Pages ) + " Pages of TMDb " + Loc.kRecMovies ) // Process Page 1 If TMDB_Recommendations.HasName("results") And TMDB_Recommendations.Count > 0 Then For i as Integer = 0 to TMDB_Recommendations.Child("results").Count -1 Dim jItem as New JSONItem If TMDB_Recommendations.Child("results").Value(i) <> Nil Then jItem = TMDB_Recommendations.Child("results").Value(i) Else Continue MovieAttr.RecMovies.Append jItem.Value("title") MovieAttr.RecMoviesIDs.Append jItem.Value("id") MovieAttr.RecMoviesSources.Append "TMDB" Next End If // Process Page 2+ If Prefs.integerForKey("TMDBRecommendations") > 1 Or Prefs.integerForKey("TMDBRecommendations") = 0 Then If TMDB_Recommendations.HasName("total_pages") Then For i as Integer = 2 To Pages dlgProgress.Debug( Str( i ) + Loc.k1of2 + Str( Pages ) + " " + Loc.kRecMovies ) App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Recommendations Page " + Str( i ) + " of " + Str( Pages ) JSONString = "" If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieRecommendations", ID, Lang, i ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim RecommendedPage as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb " + Loc.kRecMovies + " " + Str( i ) ) Then RecommendedPage.Load( JSONString ) JSONString = "" // Process Page results If RecommendedPage <> Nil And RecommendedPage.HasName("results") And RecommendedPage.Child("results").Count > 0 Then For n as Integer = 0 to RecommendedPage.Child("results").Count - 1 Dim jItem as New JSONItem If RecommendedPage.Child("results").Value(n) <> Nil Then jItem = RecommendedPage.Child("results").Value(n) Else Continue If jItem.HasName("title") And jItem.HasName("id") Then MovieAttr.RecMovies.Append jItem.Value("title") MovieAttr.RecMoviesIDs.Append jItem.Value("id") MovieAttr.RecMoviesSources.Append "TMDB" End If Next End If Next End If // @END RecommendedPages End If // @END Prefs.integerForKey("TMDBRecommendations") > 1 End If // @END Prefs.integerForKey("TMDBRecommendations") > 0 App.ErrorMessage = "Update: " + Str( Update ) + " - IMDb Recommendations" // IMDb Recommendations If IMDb <> Nil And IMDb.HasName("RECOMMENDATIONS") Then dlgProgress.Debug( "IMDb " + Loc.kRecMovies + "..." ) For i as Integer = 0 to IMDb.Child("RECOMMENDATIONS").Count -1 Dim RecTitle as String = Trim( RegExThis( IMDb.Child("RECOMMENDATIONS").Value(i), "\[.*\]", "" ) ) Dim RecID as String = Trim( RegExThis( IMDb.Child("RECOMMENDATIONS").Value(i), ".*\[", "" ) ).ReplaceAll("]","") If RecTitle = "" Then RecTitle = Loc.kNotAvailable MovieAttr.RecMovies.Append RecTitle MovieAttr.RecMoviesIDs.Append RecID MovieAttr.RecMoviesSources.Append "IMDb" Next End If JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TraktTV Recommendations" If ID <> "" And Prefs.stringForKey("Trakttv_Password") <> "" And Prefs.stringForKey("Trakttv_UserName") <> "" Then 'And Prefs.boolForKey("TraktTVEnabled") Then dlgProgress.Debug( "TraktTV " + Loc.kRecMovies + "..." ) Dim TraktTV as New JSONItem JSONString = Sckt.Get( URLCore.TraktTV( "MovieRelated", ID ), 30 ) If JSONString.ValidJSON("TraktTV", True) Then TraktTV.Load JSONString If TraktTV <> Nil And TraktTV.IsArray Then For i as Integer = 0 to TraktTV.Count -1 Dim jItem as New JSONItem jItem = TraktTV.Child(i) If jItem <> Nil And jItem.HasName("title") And jItem.Value("title") <> "" And ( jItem.HasName("imdb_id") OR jItem.HasName("tmdb_id") ) Then MovieAttr.RecMovies.Append jItem.Value("title") If jItem.HasName("imdb_id") and jItem.Value("imdb_id") <> "" Then MovieAttr.RecMoviesIDs.Append jItem.Value("imdb_id") ElseIf jItem.HasName("tmdb_id") And jItem.Value("tmdb_id") <> "" Then MovieAttr.RecMoviesIDs.Append jItem.Value("tmdb_id") Else MovieAttr.RecMoviesIDs.Append "" End If MovieAttr.RecMoviesSources.Append "Trakt.tv" End If Next End If End If End If // @END NOT YAMJ & Get Recommendations dlgProgress.Debug("") // ## ---- Process Information App.ErrorMessage = "Update: " + Str( Update ) + " - Process Information" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kReadingInfo + ":", MovieInfo ) Else dlgProgress.Debug( Loc.kProcessing + " " + MovieInfo ) If Lang = "en-gb" Then Lang = "GB" If Lang.InStr(0, "en") > 0 Then Lang = "US" Else Lang = Lang.Uppercase Dim IMDbEnabled as Boolean = ( IMDb <> Nil And Trim( IMDb.ToString ) <> "" ) // ## ID's App.ErrorMessage = "Update: " + Str( Update ) + " - Process IDs" If IMDbID.Left(2) = "tt" Then MovieAttr.ID_IMDB = IMDbID If TMDB_US.HasName("id") Then MovieAttr.ID_TMDB = TMDB_US.Value("id") If Tomatoes <> Nil And Tomatoes.HasName("id") Then MovieAttr.ID_RottenTomatoes = Tomatoes.Value("id") // ## Title App.ErrorMessage = "Update: " + Str( Update ) + " - Process Title" If NOT Update OR Trim( MovieAttr.Title ) = "" Then If TMDB_US <> Nil And TMDB_US.HasName("title") And TMDB_US.Value("title") <> "" Then MovieAttr.Title = TMDB_US.Value("title") 'If ( Lang <> "US" And Lang <> "GB" And MovieAttr.Title = "" ) or MovieAttr.Title = "" Then If MovieAttr.Title = "" And IMDb <> Nil And IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then MovieAttr.Title = IMDb.Value("TITLE") 'End If If TMDB_Local <> Nil And TMDB_Local.HasName("title") And TMDB_Local.Value("title") <> "" Then MovieAttr.Title = TMDB_Local.Value("title") End If // ## Localized Title App.ErrorMessage = "Update: " + Str( Update ) + " - Process Localized Title" If NOT Update And Lang <> "US" And TMDB_AltTitles.HasName("titles") Then 'And Lang <> "GB" For i as Integer = 0 to TMDB_AltTitles.Child("titles").Count -1 Dim jItem as New JSONItem jItem = TMDB_AltTitles.Child("titles").Child(i) If jItem.Value("iso_3166_1") = Lang And jItem.Value("title") <> "" Then MovieAttr.Title = jItem.Value("title") Exit End If Next End If // ## Original Title App.ErrorMessage = "Update: " + Str( Update ) + " - Process Original Title" If NOT Update OR Trim( MovieAttr.TitleOriginal ) = "" Then If TMDB_US.HasName("original_title") And TMDB_US.Value("original_title") <> "" Then MovieAttr.TitleOriginal = TMDB_US.Value("original_title") 'If Lang <> "US" And Lang <> "GB" And IMDb <> Nil And IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" And Len( IMDb.Value("TITLE") ) >= Len( MovieAttr.TitleOriginal ) Then MovieAttr.TitleOriginal = IMDb.Value("TITLE") If MovieAttr.TitleOriginal = "" And IMDb <> Nil And IMDb.HasName("ORIGINAL_TITLE") And IMDb.Value("ORIGINAL_TITLE") <> "" Then MovieAttr.TitleOriginal = IMDb.Value("ORIGINAL_TITLE") If MovieAttr.TitleOriginal = "" And MovieAttr.Title <> "" Then MovieAttr.TitleOriginal = MovieAttr.Title If MovieAttr.Title = "" And MovieAttr.TitleOriginal <> "" Then MovieAttr.Title = MovieAttr.TitleOriginal End If // ## Sort Title App.ErrorMessage = "Update: " + Str( Update ) + " - Process Sort Title" If NOT Update OR Trim( MovieAttr.TitleSort ) = "" Then MovieAttr.TitleSort = Articulator( MovieAttr.Title ) // ## Descriptions App.ErrorMessage = "Update: " + Str( Update ) + " - Process Descriptions" // -- Plot If TMDB_US.HasName("overview") And TMDB_US.Value("overview") <> "" Then MovieAttr.DescriptionPlot = TMDB_US.Value("overview") If TMDB_Local.HasName("overview") And TMDB_Local.Value("overview") <> "" Then MovieAttr.DescriptionPlot = TMDB_Local.Value("overview") // -- Tagline App.ErrorMessage = "Update: " + Str( Update ) + " - Process Tagline" If TMDB_US.HasName("tagline") and TMDB_US.Value("tagline") <> "" Then MovieAttr.DescriptionTagline = TMDB_US.Value("tagline") MovieAttr.DescriptionTaglines.Append TMDB_US.Value("tagline") End If If TMDB_Local.HasName("tagline") and TMDB_Local.Value("tagline") <> "" Then MovieAttr.DescriptionTagline = TMDB_Local.Value("tagline") MovieAttr.DescriptionTaglines.Append TMDB_Local.Value("tagline") End If // Extra Tagline(s) If IMDb <> Nil And IMDb.HasName("TAGLINES") Then For i as Integer = 0 to IMDb.Child("TAGLINES").Count -1 MovieAttr.DescriptionTaglines.Append Trim( RegExThis( IMDb.Child("TAGLINES").Value(i), "\[.*\]", "" ) ) Next End If MovieAttr.DescriptionTaglines = RemoveDuplicatesFromArray( MovieAttr.DescriptionTaglines ) If MovieAttr.DescriptionTagline = "" And MovieAttr.DescriptionTaglines.Ubound >= 0 Then MovieAttr.DescriptionTagline = MovieAttr.DescriptionTaglines(0) // -- Outline App.ErrorMessage = "Update: " + Str( Update ) + " - Process Outline" If Lang = "US" OR Lang = "GB" Then If IMDb <> Nil And IMDb.HasName("PLOT") And IMDb.Value("PLOT") <> "" And Len( IMDb.Value("PLOT") ) > Len( MovieAttr.DescriptionPlot ) Then MovieAttr.DescriptionPlot = IMDb.Value("PLOT") If IMDb <> Nil And IMDb.HasName("STORYLINE") And IMDb.Value("STORYLINE") <> "" And _ Len( IMDb.Value("STORYLINE") ) > Len( MovieAttr.DescriptionPlot ) Then MovieAttr.DescriptionPlot = IMDb.Value("STORYLINE") // In case the storyline has been shortened, get the full version. If IMDb <> Nil And IMDb.HasName("STORYLINES") And IMDb.Child("STORYLINES").Count > 0 And _ Len( IMDb.Child("STORYLINES").Value(0) ) > Len( MovieAttr.DescriptionPlot ) Then MovieAttr.DescriptionPlot = IMDb.Child("STORYLINES").Value(0) End If // If the outline hasn't been filled yet, take the localized plot, and shorten it. If MovieAttr.DescriptionOutline = "" And MovieAttr.DescriptionPlot <> "" Then Dim Outline as String = MovieAttr.DescriptionPlot Dim sx1 as Integer = Outline.InStr( 200, "." ) Dim sx2 as Integer = Outline.InStr( sx1, "." ) // catch a second sentence. If sx2 > 0 Then Outline = Trim( Outline.Left( sx2 ) ) + ".." ElseIf sx1 > 0 Then Outline = Trim( Outline.Left( sx1 ) ) + ".." End If MovieAttr.DescriptionOutline = Outline End If // ## Release Dates App.ErrorMessage = "Update: " + Str( Update ) + " - Process Release Dates" If TMDB_US.HasName("release_date") Then MovieAttr.DatePremiered = TMDB_US.Value("release_date") If TMDB_Local.HasName("release_date") Then MovieAttr.DatePremiered = TMDB_Local.Value("release_date") If MovieAttr.DatePremiered <> "" Then MovieAttr.DateYear = Val( MovieAttr.DatePremiered.Left(4) ) If Tomatoes <> Nil And Tomatoes.HasName("release_dates") And Tomatoes.Child("release_dates").HasName("dvd") Then MovieAttr.DateReleasedOnDVD = Tomatoes.Child("release_dates").Value("dvd") End If If IMDb <> Nil And IMDb.HasName("RELEASE_DATE") And IMDb.Value("RELEASE_DATE") <> "" And IMDb.Value("RELEASE_DATE") <> "False" Then MovieAttr.DatePremiered = _ IMDb.Value("RELEASE_DATE").Right(4) + "-" + _ // Year - Month2Int( Trim( RegExThis( IMDb.Value("RELEASE_DATE"), "[0-9]", "" ) ) ) + "-" + _ // Month - IMDb.Value("RELEASE_DATE").Left(2) // Day If IMDb <> Nil And IMDb.HasName("YEAR") And IMDb.Value("YEAR") <> "" THen MovieAttr.DateYear = IMDb.Value("YEAR") End If // ## MPAA App.ErrorMessage = "Update: " + Str( Update ) + " - Process MPAA" Dim MPAAExplanation as String If IMDb <> Nil And IMDb.HasName("MPAA_RATING") And IMDb.Value("MPAA_RATING").InStr( 0, " for " ) > 0 Then MPAAExplanation = Trim( RegExThis( IMDb.Value("MPAA_RATING"), "RATED.*for ", "" ) ) MPAAExplanation = Trim( MPAAExplanation.ReplaceAll("(re-rating on appeal)","").ReplaceAll("on appeal","") ) End If // TMDB Certifications App.ErrorMessage = "Update: " + Str( Update ) + " - Process TMDb Certifications" If TMDB_Releases.HasName("countries") Then Dim aCountries(), aMPAA() as String For i as Integer = 0 to TMDB_Releases.Child("countries").Count -1 Dim jItem as New JSONItem jItem = TMDB_Releases.Child("countries").Child(i) aCountries.Append jItem.Value("iso_3166_1") aMPAA.Append jItem.Value("certification") // U.S. If jItem.Value("iso_3166_1") = "US" Then If MovieAttr.DatePremiered = "" Then MovieAttr.DatePremiered = jItem.Value("release_date") If Trim( jItem.Value("certification") ) <> "" And MovieAttr.RatingMPAA = "" Then MovieAttr.RatingMPAA = MPAAFromCountry( jItem.Value("certification"), "US" ) End If // Local If jItem.Value("iso_3166_1") = Lang Then MovieAttr.DatePremiered = jItem.Value("release_date") If Trim( jItem.Value("certification") ) <> "" Then MovieAttr.RatingMPAA = MPAAFromCountry( jItem.Value("certification"), Lang ) End If Next // @END ReleaseCountries.count For i as Integer = 0 to aCountries.Ubound If aMPAA(i) <> "" Then MovieAttr.RatingCertification.Append FlagCountry( aCountries(i) ) + ":" + aMPAA(i) Next End If // @END TMDB_Releases.HasName("countries") // IMDb Certifications App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Certifications" If IMDb <> Nil And IMDb.HasName("CERTIFICATIONS") Then For i as Integer = 0 To IMDb.Child("CERTIFICATIONS").Count -1 MovieAttr.RatingCertification.Append IMDb.Child("CERTIFICATIONS").Value(i) Next End If MovieAttr.RatingCertification = RemoveDuplicatesFromArray( MovieAttr.RatingCertification ) If MovieAttr.RatingMPAA = "" And IMDb <> Nil And IMDb.HasName("MPAA_RATING") Then MovieAttr.RatingMPAA = Trim( IMDb.Value("MPAA_RATING").Left( IMDb.Value("MPAA_RATING").InStrB( 0, " for " ) ) ) MovieAttr.RatingMPAA = MovieAttr.RatingMPAA.ReplaceAll("on appeal","") End If // String 'em up together If MPAAExplanation <> "" And MovieAttr.RatingMPAA <> "" Then MovieAttr.RatingMPAA = MovieAttr.RatingMPAA + " for " + MPAAExplanation + "." // ## Rating App.ErrorMessage = "Update: " + Str( Update ) + " - Process Ratings" If Prefs.stringForKey("PreferredRatings").Contains("TMDb") OR MovieAttr.Rating <= 0 Then If TMDB_US.HasName("vote_average") Then MovieAttr.Rating = Round( TMDB_US.Value( "vote_average" ) * 10 ) / 10 If TMDB_US.HasName("vote_count") Then MovieAttr.RatingVotes = TMDB_US.Value("vote_count") End If If Prefs.stringForKey("PreferredRatings").Contains("IMDb") OR Prefs.stringForKey("PreferredRatings") = "" OR MovieAttr.Rating <= 0 Then If IMDb <> Nil And IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then MovieAttr.Rating = IMDb.Value("RATING") If IMDb <> Nil And IMDb.HasName("VOTES") And IMDb.Value("VOTES") <> "" Then MovieAttr.RatingVotes = Val( IMDb.Value("VOTES").ReplaceAll(",","") ) End If // Top250 App.ErrorMessage = "Update: " + Str( Update ) + " - Process Top250" If IMDb <> Nil And IMDb.HasName("TOP_250") And IMDb.Value("TOP_250") > 0 Then MovieAttr.RatingTop250 = IMDb.Value("TOP_250") // ## Genres App.ErrorMessage = "Update: " + Str( Update ) + " - Process Genres" Dim TmpArray() as String If TMDB_Local.HasName("genres") Then TmpArray = JSONArray( TMDB_Local.Child("genres"), "name" ) ElseIf TMDB_US.HasName("genres") Then TmpArray = JSONArray( TMDB_US.Child("genres"), "name" ) End If For i as Integer = 0 to TmpArray.Ubound MovieAttr.Genres.Append TmpArray(i) Next If IMDb <> Nil Then If IMDbEnabled And IMDb.HasName("GENRES") And ( Lang = "US" OR Lang = "GB" ) Then TmpArray = JSONArray( IMDb.Child("GENRES") ) For i as Integer = 0 to TmpArray.Ubound MovieAttr.Genres.Append TmpArray(i).ReplaceAll("Sci-Fi", "Science-Fiction") Next End If End If // Sort out doubles. MovieAttr.Genres = RemoveDuplicatesFromArray( MovieAttr.Genres ) // All Caps for Boxee If Prefs.stringForKey("MediaPlayer") = "Boxee" Then For i as Integer = 0 To MovieAttr.Genres.Ubound MovieAttr.Genres(i) = MovieAttr.Genres(i).Uppercase Next End If // ## Studios App.ErrorMessage = "Update: " + Str( Update ) + " - Process Studios" If Tomatoes <> Nil And Tomatoes.HasName("studio") And Tomatoes.Value("studio") <> "" Then MovieAttr.Studios.Append Tomatoes.Value("studio") If TMDB_US.HasName("production_companies") Then MovieAttr.Studios = JSONArray( TMDB_US.Child("production_companies"), "name" ) If IMDb <> Nil And IMDb.HasName("STUDIOS") Then For i as Integer = 0 to IMDb.Child("STUDIOS").Count -1 MovieAttr.Studios.Append IMDb.Child("STUDIOS").Value(i) Next End If MovieAttr.Studios = RemoveDuplicatesFromArray( MovieAttr.Studios ) // ## Countries App.ErrorMessage = "Update: " + Str( Update ) + " - Process Countries" If TMDB_US.HasName("production_countries") Then MovieAttr.Countries = JSONArray( TMDB_US.Child("production_countries"), "name" ) If IMDb <> Nil And IMDb.HasName("COUNTRY") Then For i as Integer = 0 to IMDb.Child("COUNTRY").Count -1 MovieAttr.Countries.Append IMDb.Child("COUNTRY").Value(i) Next End If MovieAttr.Countries = RemoveDuplicatesFromArray( MovieAttr.Countries ) // ## Spoken Languages App.ErrorMessage = "Update: " + Str( Update ) + " - Process Spoken Languages" If TMDB_US.HasName("spoken_languages") Then MovieAttr.LanguagesSpoken = JSONArray( TMDB_US.Child("spoken_languages"), "name" ) MovieAttr.LanguagesSpokenCode = JSONArray( TMDB_US.Child("spoken_languages"), "iso_639_1" ) End If If IMDb <> Nil And IMDb.HasName("LANGUAGE") Then For i as Integer = 0 to IMDb.Child("LANGUAGE").Count -1 MovieAttr.LanguagesSpoken.Append IMDb.Child("LANGUAGE").Value(i) Next End If MovieAttr.LanguagesSpoken = RemoveDuplicatesFromArray( MovieAttr.LanguagesSpoken ) // ## Runtime App.ErrorMessage = "Update: " + Str( Update ) + " - Process Runtime" If TMDB_US.HasName("runtime") Then MovieAttr.InfoRuntime = Val( TMDB_US.Value("runtime").ReplaceAll("Min","").ReplaceAll("Minutes","") ) // ## IMDb Stars App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Stars" If IMDb <> Nil And IMDb.HasName("STARS") Then MovieAttr.ActorStar = JSONArray( IMDb.Child("STARS") ) // ## Cast App.ErrorMessage = "Update: " + Str( Update ) + " - Process Cast" If IMDb <> Nil And IMDb.HasName("CAST") And IMDb.HasName("ROLES") And IMDb.HasName("CASTTHUMBS") Then App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Cast" For i as Integer = 0 to IMDb.Child("CAST").Count -1 // Search cast ID if available. If TMDB_Cast.HasName("cast") Then Dim b as Boolean = False For n as Integer = 0 to TMDB_Cast.Child("cast").Count -1 If TMDB_Cast.Child("cast").Child(n).Value("name") = IMDb.Child("CAST").Value(i) Then MovieAttr.ActorID.Append TMDB_Cast.Child("cast").Child(n).Value("id") b = True Exit End If Next If NOT b Then MovieAttr.ActorID.Append "" Else MovieAttr.ActorID.Append "" End If MovieAttr.ActorName.Append IMDb.Child("CAST").Value(i) MovieAttr.ActorRole.Append IMDb.Child("ROLES").Value(i) MovieAttr.ActorThumbURL.Append IMDb.Child("CASTTHUMBS").Value(i) Next ElseIf TMDB_Cast.HasName("cast") Then App.ErrorMessage = "Update: " + Str( Update ) + " - Process TMDb Cast" For i as Integer = 0 to TMDB_Cast.Child("cast").Count - 1 Dim jItem as New JSONItem jItem = TMDB_Cast.Child("cast").Child(i) MovieAttr.ActorID.Append jItem.value("id") MovieAttr.ActorName.Append jItem.Value("name") MovieAttr.ActorRole.Append jItem.Value("character") If jItem.Value("profile_path") = "" Then MovieAttr.ActorThumbURL.Append "" Else MovieAttr.ActorThumbURL.Append URLbase_image + "w342" + jItem.Value("profile_path") Next End If // ## Crew App.ErrorMessage = "Update: " + Str( Update ) + " - Process TMDb Crew" Dim TmpDirectors(), TmpWriters(), TmpCamera() as String If TMDB_Cast.HasName("crew") Then For i as Integer = 0 to TMDB_Cast.Child("crew").Count -1 Dim jItem as New JSONItem jItem = TMDB_Cast.Child("crew").Child(i) If jItem.Value("department") = "Directing" Then TmpDirectors.Append jItem.Value("name") If jItem.Value("department") = "Writing" Then TmpWriters.Append jItem.Value("name") If jItem.Value("department") = "Camera" Then TmpCamera.Append jItem.Value("name") If jItem.Value("department") = "Sound" OR jItem.Value("department") = "Music" Then If MovieAttr.CreditMusic = "" Then MovieAttr.CreditMusic = jItem.Value("name") Else MovieAttr.CreditMusic = MovieAttr.CreditMusic + ", " + jItem.Value("name") End If End If Next // @END Crew.Count End If // @END Crew // IMDb Directors App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Directors" If IMDb <> Nil And IMDb.HasName("DIRECTORS") Then For i as Integer = 0 to IMDb.Child("DIRECTORS").Count -1 TmpDirectors.Append IMDb.Child("DIRECTORS").Value(i) Next End If // IMDb Writers App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Writers" If IMDb <> Nil And IMDb.HasName("WRITERS") Then For i as Integer = 0 to IMDb.Child("WRITERS").Count -1 TmpWriters.Append IMDb.Child("WRITERS").Value(i) Next End If TmpDirectors = RemoveDuplicatesFromArray( TmpDirectors ) TmpWriters = RemoveDuplicatesFromArray( TmpWriters ) TmpCamera = RemoveDuplicatesFromArray( TmpCamera ) For i as Integer = 0 to TmpDirectors.Ubound If MovieAttr.CreditDirector = "" Then MovieAttr.CreditDirector = TmpDirectors(i) Else MovieAttr.CreditDirector = MovieAttr.CreditDirector + ", " + TmpDirectors(i) End If Next For i as Integer = 0 to TmpWriters.Ubound If MovieAttr.CreditWriter = "" Then MovieAttr.CreditWriter = TmpWriters(i) Else MovieAttr.CreditWriter = MovieAttr.CreditWriter + ", " + TmpWriters(i) End If Next For i as Integer = 0 to TmpCamera.Ubound If MovieAttr.CreditCamera = "" Then MovieAttr.CreditCamera = TmpCamera(i) Else MovieAttr.CreditCamera = MovieAttr.CreditCamera + ", " + TmpCamera(i) End If Next // ## RottenTomatoes If Prefs.boolForKey("RTEnabled") And Prefs.boolForKey("RTRatingsEnabled") Then App.ErrorMessage = "Update: " + Str( Update ) + " - Process Rotten Tomatoes Critics" If Tomatoes <> Nil And Tomatoes.HasName("critics_consensus") Then MovieAttr.TomatoConcensus = Tomatoes.Value("critics_consensus") If Tomatoes <> Nil And Tomatoes.HasName("ratings") Then Dim jItem as New JSONItem jItem = Tomatoes.Child("ratings") If jItem.HasName("critics_rating") Then MovieAttr.TomatoCriticsRating = jItem.Value("critics_rating") If jItem.HasName("critics_score") Then MovieAttr.TomatoCriticsScore = jItem.Value("critics_score") If Prefs.stringForKey("PreferredRatings").Contains("Tomato") And Prefs.stringForKey("PreferredRatings").Contains("Critics") And MovieAttr.TomatoCriticsScore > 0 Then MovieAttr.RatingVotes = -1 MovieAttr.Rating = ( MovieAttr.TomatoCriticsScore / 10 ) End If If jItem.HasName("audience_rating") Then MovieAttr.TomatoAudienceRating = jItem.Value("audience_rating") If jItem.HasName("audience_score") Then MovieAttr.TomatoAudienceScore = jItem.Value("audience_score") If Prefs.stringForKey("PreferredRatings").Contains("Tomato") And Prefs.stringForKey("PreferredRatings").Contains("Audience") And MovieAttr.TomatoAudienceScore > 0 Then MovieAttr.RatingVotes = -1 MovieAttr.Rating = ( MovieAttr.TomatoAudienceScore / 10 ) End If End If End If // ## Download actor images. App.ErrorMessage = "Update: " + Str( Update ) + " - Download Actor Images" If Prefs.boolForKey("AutoDownloadActorThumbs") Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kActorThumbs + "..." ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kActorThumbs.Lowercase + "..." ) App.ErrorMessage = ID + " - Creating .actors folder" If NOT MovieAttr.FolderParent.Child(".actors").Exists Then MovieAttr.FolderParent.Child(".actors").CreateAsFolder App.ErrorMessage = ID + " - Remove pre-existing symlink folder" dim symdest as FolderItem = MovieAttr.FolderParent.Child("actors") symdest.Visible = True App.ErrorMessage = ID + " - Creating symlink folder" If SymLink( MovieAttr.FolderParent.Child( ".actors" ), MovieAttr.FolderParent.Child( "actors" ) ) Then // Created symlink End If App.ErrorMessage = ID + " - Getting actors folder" Dim ActorFolder as FolderItem = MovieAttr.FolderParent.Child(".actors") If ActorFolder = Nil OR NOT ActorFolder.Exists Then ActorFolder = MovieAttr.FolderParent.Child("actors") App.ErrorMessage = ID + " - Setting Max Actor Downloads" Dim Max as Integer = MovieAttr.ActorThumbURL.Ubound If Prefs.integerForKey("MaxActors") > 0 And Prefs.integerForKey("MaxActors") <= Max Then Max = Prefs.integerForKey("MaxActors") If ActorFolder <> Nil And ActorFolder.Exists Then For i as Integer = 0 to Max App.ErrorMessage = ID + " - Actor Name: " + MovieAttr.ActorName(i).ReplaceAll(":","") + " " + Str( i ) + " of " + Str( Max ) Dim ActorFile as FolderItem = ActorFolder.Child( MovieAttr.ActorName(i).ReplaceAll(":","").ReplaceAll(" ", "_") + ".jpg" ) If MovieAttr.ActorThumbURL(i) <> "" And MovieAttr.ActorName(i) <> "" And NOT ActorFile.Exists Then dlgProgress.Debug( "Downloading " + Str( i + 1 ) + Loc.k1of2 + Str( Max + 1 ) + " " + MovieAttr.ActorName(i) + " " + Loc.kThumb.Lowercase + "..." ) App.ErrorMessage = App.ErrorMessage + Chr(13) + "Downloading: " + MovieAttr.ActorThumbURL(i) + chr(13) + "Destionation: " + ActorFile.ShellPath.ReplaceAll("\","") If Sckt.Get( MovieAttr.ActorThumbURL(i), ActorFile, TimeOut ) Then MovieAttr.ActorThumbURL(i) = ActorFile.ShellPath.ReplaceAll( "\", "" ) Else Sckt.Close If ActorFile IsA FolderItem Then ActorFile.Delete End If Sckt.Close ElseIf ActorFile.Exists Then MovieAttr.ActorThumbURL(i) = ActorFile.ShellPath.ReplaceAll( "\", "" ) End If Next End If dlgProgress.Debug "" End If // ## Get Art App.ErrorMessage = "Update: " + Str( Update ) + " - Download Images" GetArt( ID, MovieAttr.Title ) // Get IMDb Poster App.ErrorMessage = "Update: " + Str( Update ) + " - Download IMDb Images" If IMDb <> Nil And IMDb.HasName("POSTER_FULL") And IMDb.Value("POSTER_FULL") <> "" And IMDb.Value("POSTER_FULL").InStr( 0, "scorecardresearch" ) = 0 Then MovieAttr.ART_PosterURLs.Append IMDb.Value("POSTER_FULL") MovieAttr.ART_PosterThumbURLs.Append IMDb.Value("POSTER_SMALL") MovieAttr.ART_PosterDimensions.Append "" Dim PosterDest as FolderItem = MovieAttr.DestinationPoster( MovieAttr.FolderParent ) If PosterDest <> Nil And NOT PosterDest.Exists And Prefs.boolForKey("AutoDownloadPoster") Then 'URL2Picture( IMDb.Value("POSTER_FULL"), MovieAttr.FolderParent, PosterDest.Name ) If Sckt.Get( IMDb.Value("POSTER_FULL"), PosterDest, TimeOut ) Then MovieAttr.ART_Poster = Picture.Open( PosterDest ) Sckt.Close End If End If // ## Trailer Links App.ErrorMessage = "Update: " + Str( Update ) + " - Process Trailers" Dim TrailerDict as Dictionary = MovieCore.MovieTrailers( ID ) // ## Write NFO App.ErrorMessage = "Update: " + Str( Update ) + " - Write NFO" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kMetadata + ":", Loc.kWritingNFO ) Else dlgProgress.Debug( Loc.kWritingNFO ) // 17 MovieAttr.NFOWrite( MovieAttr.DestinationNFO( MovieAttr.FolderParent ) ) // Download trailer App.ErrorMessage = "Update: " + Str( Update ) + " - Download Trailer" If Prefs.boolForKey("AutoDownloadTrailer") And TrailerDict <> Nil And FindTrailerItem( MovieAttr.FolderParent ) = Nil Then Dim FirstTrailerURL as String Dim TrailerURLs(), TrailerQualities() as String For each Key as Variant in TrailerDict.Keys 'If FirstTrailerURL = "" Then FirstTrailerURL = Key TrailerURLs.Append Key TrailerQualities.Append TrailerDict.Value( Key ) Next Dim pQuality as String = Prefs.stringForKey("TrailerQuality") Dim rQuality as String If pQuality = "1080p" Then rQuality = "Large" If pQuality = "720p" Then rQuality = "Medium" If pQuality = "480p" Then rQuality = "Small" If Prefs.stringForKey("TrailerSource") <> "" And pQuality <> "" Then Dim SelTrailerURLs(), SelTrailerQualities() as String // Filter on trailer source For i as Integer = 0 to TrailerURLs.Ubound If TrailerURLs(i).Contains( Prefs.stringForKey("TrailerSource") ) Then If FirstTrailerURL = "" Then FirstTrailerURL = TrailerURLs(i) SelTrailerURLs.Append TrailerURLs(i) SelTrailerQualities.Append TrailerQualities(i) End If Next // Filter on trailer qualities For i as Integer = SelTrailerURLs.Ubound DownTo 0 If NOT SelTrailerQualities(i).Contains( pQuality ) And NOT SelTrailerQualities(i).Contains( rQuality ) Then SelTrailerURLs.Remove(i) SelTrailerQualities.Remove(i) End If Next // Set most suitable trailer If SelTrailerURLs.Ubound >= 0 Then FirstTrailerURL = SelTrailerURLs(0) If FirstTrailerURL = "" And TrailerURLs.Ubound >= 0 Then // Trailer source not found, try remaining trailer's qualities. SelTrailerURLs = TrailerURLs SelTrailerQualities = TrailerQualities For i as Integer = SelTrailerURLs.Ubound DownTo 0 If NOT SelTrailerQualities(i).Contains( pQuality ) And NOT SelTrailerQualities(i).Contains( rQuality ) Then SelTrailerURLs.Remove(i) SelTrailerQualities.Remove(i) End If Next If SelTrailerURLs.Ubound >= 0 Then FirstTrailerURL = SelTrailerURLs(0) End If End If // @END TrailerSource & TrailerQuality // Fallback If FirstTrailerURL = "" And TrailerURLs.Ubound >= 0 Then FirstTrailerURL = TrailerURLs(0) If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", MovieAttr.Title + " " + Loc.kTrailer.Lowercase + "...", 64, 100 ) Else dlgProgress.Debug( Loc.kDownloading + " " + MovieAttr.Title + " " + Loc.kTrailer.Lowercase + "..." ) End If Dim ScktTrailer as New TrailerSckt' = dlgProgress.ScktTrailer ScktTrailer.Yield = True IP = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) ScktTrailer.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) ScktTrailer.SetRequestHeader( "User-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Safari/8536.25" ) // For Apple trailers Dim TmpTrailerFile as FolderItem = SpecialFolder.Temporary.Child( App.Identifier ).Child("Trailer.part") // Download trailer If FirstTrailerURL <> "" And ScktTrailer.Get( FirstTrailerURL, TmpTrailerFile, 600 ) Then // Verify trailer file If TmpTrailerFile.Length > 1024 Then // Success! If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.MoveFileTo( MovieAttr.DestinationTrailer( MovieAttr.FolderParent, TmpTrailerFile ) ) End If Else // Failure... // Failure, try once more if possible. FirstTrailerURL = "" ScktTrailer.Close Dim Content as String If TmpTrailerFile IsA FolderItem Then Content = ReadTextFile( TmpTrailerFile ) If Content.InStr( 0, "The document has moved" ) > 0 Then FirstTrailerURL = Content.MyMid( "" ).ReplaceAll("&", "&") If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete If FirstTrailerURL <> "" And ScktTrailer.Get( FirstTrailerURL, TmpTrailerFile, 600 ) Then If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.MoveFileTo( MovieAttr.DestinationTrailer( MovieAttr.FolderParent, TmpTrailerFile ) ) Else If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete End If End If End If // @END TmpTrailerFile.length // Clean-up ScktTrailer.Close If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete End If // @END TrailerSckt.Get 'If Prefs.boolForKey("AutoDownloadTrailer") And MovieAttr.TrailerURLs.Ubound >= 0 And NOT FindTrailerItem( MovieAttr.FolderParent ) IsA FolderItem Then ' 'Dim FirstTrailerURL as String' = MovieAttr.TrailerURLs(0) 'Dim TrailerSelection(), TrailerQualities() as String ' 'If Prefs.stringForKey("TrailerSource") <> "" And Prefs.stringForKey("TrailerQuality") <> "" Then 'And Prefs.stringForKey("TrailerSource") <> "youtube.com" Then ' '// Get all trailers from selected source 'For i as Integer = 0 to MovieAttr.TrailerURLs.Ubound 'If MovieAttr.TrailerURLs(i).InStr( 0, Prefs.stringForKey("TrailerSource") ) > 0 Then 'TrailerSelection.Append MovieAttr.TrailerURLs(i) 'TrailerQualities.Append MovieAttr.TrailerQuality(i) 'End If 'Next ''If TrailerSelection.Ubound >= 0 Then FirstTrailerURL = TrailerSelection(0) // Set first likely trailer to be downloaded. ' 'If TrailerSelection.Ubound = -1 Then 'For i as Integer = 0 to MovieAttr.TrailerURLs.Ubound 'TrailerSelection.Append MovieAttr.TrailerURLs(i) 'TrailerQualities.Append MovieAttr.TrailerQuality(i) 'Next 'End If ''If TrailerSelection.Ubound >= 0 Then FirstTrailerURL = TrailerSelection(0) // Set first likely trailer to be downloaded. ' '// Remove all trailers that don't have the wanted quality. 'For i as Integer = TrailerSelection.Ubound DownTo 0 'If TrailerQualities(i) <> Prefs.stringForKey("TrailerQuality") And TrailerSelection(i).InStr( 0, "youtube" ) = 0 Then 'TrailerSelection.Remove(i) 'TrailerQualities.Remove(i) 'End If 'Next ' '// Set most suitable trailer to be downloaded 'For i as Integer = 0 to TrailerSelection.Ubound 'If TrailerSelection(i).InStr( 0, "youtube" ) > 0 Then 'Continue 'Else 'FirstTrailerURL = TrailerSelection(i) 'Exit 'End If 'Next 'If FirstTrailerURL = "" And TrailerSelection.Ubound >= 0 Then FirstTrailerURL = TrailerSelection(0) ''If TrailerSelection.Ubound >= 0 Then FirstTrailerURL = TrailerSelection(0) 'End If ' ' 'If NOT CommonCore.MassSearch Then 'dlgProgress.Update( Loc.kDownloading + ":", MovieAttr.Title + " " + Loc.kTrailer.Lowercase + "...", 64, 100 ) 'Else 'dlgProgress.Debug( Loc.kDownloading + " " + MovieAttr.Title + " " + Loc.kTrailer.Lowercase + "..." ) 'End If ' 'Dim ScktTrailer as New TrailerSckt 'ScktTrailer.Yield = False ' 'IP = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) 'ScktTrailer.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) 'ScktTrailer.SetRequestHeader( "User-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Safari/8536.25" ) ' ' 'If FirstTrailerURL.InStr( 0, "youtube" ) > 0 Then 'Dim YTContent as String = ScktTrailer.Get( MovieAttr.TrailerURLs(0), Prefs.integerForKey("TimeOut") ) ' ''Dim TrailerURL as String 'If YTContent <> "" Then FirstTrailerURL = ScktTrailer.YoutubeContent( YTContent, "", True ) 'End If ' ' 'Dim TmpTrailerFile as FolderItem = SpecialFolder.Temporary.Child( App.Identifier ).Child("Trailer.part") 'MovieAttr.FolderParent.Child("Trailer.part") ' 'If FirstTrailerURL <> "" And ScktTrailer.Get( FirstTrailerURL, TmpTrailerFile, 600 ) Then ' 'If TmpTrailerFile.Length > 1024 Then '// Success 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.MoveFileTo( MovieAttr.DestinationTrailer( MovieAttr.FolderParent, TmpTrailerFile ) ) ' ' 'Else '// Failure, try once more. 'FirstTrailerURL = "" 'ScktTrailer.Close 'Dim Content as String 'If TmpTrailerFile IsA FolderItem Then Content = ReadTextFile( TmpTrailerFile ) 'If Content.InStr( 0, "The document has moved" ) > 0 Then FirstTrailerURL = Content.MyMid( "" ).ReplaceAll("&", "&") ' 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete ' 'If FirstTrailerURL <> "" And ScktTrailer.Get( FirstTrailerURL, TmpTrailerFile, 600 ) Then 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.MoveFileTo( MovieAttr.DestinationTrailer( MovieAttr.FolderParent, TmpTrailerFile ) ) 'Else 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete 'End If ' 'End If ' 'Else ''If NOT CommonCore.MassSearch Then MessageBox "Trailer download failed!" 'End If ' 'ScktTrailer.Close 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete 'End If // ## AutoManage Media App.ErrorMessage = "Update: " + Str( Update ) + " - AutoManage Media" If MovieAttr.RipSource = "" Then MovieAttr.RipSource = FindRipSource( MovieAttr.FolderParent ) If NOT CommonCore.MassSearch And Prefs.boolForKey("AutoManageMedia") Then SingleRenamer MovieAttr.FolderParent, -1, True // 18 End If Exception err as KeyNotFoundException Dim w as New wndBugReporter w.Init( err, App.ErrorMessage ) End Sub #tag EndMethod #tag Method, Flags = &h0 Function URL(Method As String, Parameter As String, Lang As String = "All", Page As Integer = 1, Opt As String = "") As String Dim ext as String Dim Base as String = URLbase Dim ApiKey as String = MovieCore.ApiKey_TMDB If Lang = "All" Then Lang = "" ElseIf Lang = "" Then Lang = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) Else Lang = Lang End If Select Case Method Case "MovieInfo" ext = URLmovie_info Lang = "&language=" + Lang Case "MovieAlternativeTitles" ext = URLmovie_alternative_titles If Lang <> "" Then Lang = "&language=" + Lang Case "MovieCast" ext = URLMovie_casts Case "MovieImages" ext = URLmovie_images Lang = "" Case "MovieReleases" ext = URLmovie_releases If Lang <> "" Then Lang = "&language=" + Lang Case "MovieTrailers" ext = URLmovie_trailers If Lang <> "" Then Lang = "&language=" + Lang Case "SearchMovie" ext = URLsearch_movie If Lang <> "" Then Lang = "&language=" + Lang if opt = "" then dim year as string year = match( "\([0-9][0-9][0-9][0-9]\)", Parameter ) if year = "" then year = match( "\[[0-9][0-9][0-9][0-9]\]", Parameter ) if year <> "" then Parameter = Parameter.ReplaceAll(year, "") opt = year.ReplaceAll("[","").ReplaceAll("]","") end if else Parameter = Parameter.ReplaceAll(year,"") opt = year.ReplaceAll("(","").ReplaceAll(")","") end if end if If Opt <> "" Then Opt = "&year=" + opt Parameter = String2Entities( Parameter ) Case "MovieRecommendations" ext = URLmovie_similar If Lang <> "" Then Lang = "&language=" + Lang // ---- RottenTomatoes Case "TomatoesSearch" ext = URLtomatoes_search Lang = "&country=" + Lang Opt = "&page_limit=" + Opt Case "TomatoesMovieInfo" ext = URLtomatoes_movie Lang = "" Case "TomatoesMovieAlias" ext = URLtomatoes_movie_alias Case "TomatoesMovieReviews" ext = URLtomatoes_movie_reviews Lang = "" Opt = "&page_limit=50&review_type=" + Opt // Review Types: "all", "top_critic" and "dvd". Default: "top_critic" Case "TomatoesMovieCast" Base = "" ext = URLtomatoes_movie_cast Lang = "" 'Lang = "&country=" + Lang Case "TomatoesMovieSimiliar" ext = URLtomatoes_movie_similiar Lang = "" Opt = "&limit=5" Case "TomatoesMovieClips" ext = URLtomatoes_movie_clips Lang = "" Case "TomatoesBoxOffice" ext = URLtomatoes_lists_box_office Lang = "&country=" + Lang Opt = "&limit=10" End Select Return Base + ext.ReplaceAll("{0}", Parameter ) + ApiKey + "&page=" + Str(Page) + Lang + Opt + "&include_adult=true" End Function #tag EndMethod #tag Note, Name = Image Sizes "images": { "backdrop_sizes": ["w300", "w780", "w1280", "original"], "base_url": "http://cf2.imgobject.com/t/p/", "poster_sizes": ["w92", "w154", "w185", "w342", "w500", "original"], "profile_sizes": ["w45", "w185", "h632", "original"] } Construction: URLbase_image + "{size}" + "image.jpg" #tag EndNote #tag Note, Name = Untitled Dim Lang as String = Prefs.stringForKey("DBLanguage") If Lang.InStr(0,"-") = 0 Then Lang = Lang + "-" + Lang If Lang = "en-en" Then Lang = "en" Dim test as JSONItem Dim Base as String = "http://api.themoviedb.org/3" Dim Extension as String Select Case url Case "misc_upcoming" Extension = "/movie/upcoming?page={0}&api_key=" End Select Return Base + Extension.ReplaceAll("{0}", prm) + ApiKey If ID.Left(2) = "tt" then // IMDB Lookup Return "http://api.themoviedb.org/2.1/Movie.imdbLookup/" + Lang + "/xml/" + ApiKey + "/" + ID Else // TMDB Lookup Return "http://api.themoviedb.org/2.1/Movie.getInfo/" + Lang + "/xml/" + ApiKey + "/" + ID End If #tag EndNote #tag Note, Name = URL Construction Return URLbase + URL*.ReplaceAll("{0}", "ID or Query") + ApiKey + "&page=" + "1+" + "&language=" URL search_* all have multi pages. URL top_rated/popular/upcoming all have (5) multi-pages. #tag EndNote #tag Property, Flags = &h0 ShowProgress As Boolean = False #tag EndProperty #tag Constant, Name = URLbase, Type = String, Dynamic = False, Default = \"http://api.themoviedb.org/3", Scope = Public #tag EndConstant #tag Constant, Name = URLbase_image, Type = String, Dynamic = False, Default = \"http://image.tmdb.org/t/p/", Scope = Public #tag EndConstant #tag Constant, Name = URLcompany_info, Type = String, Dynamic = False, Default = \"/company/{0}\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLcompany_movies, Type = String, Dynamic = False, Default = \"/company/{0}/movies\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLconfiguration, Type = String, Dynamic = False, Default = \"/configuration\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLgenre_list, Type = String, Dynamic = False, Default = \"/genre/list\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLgenre_movies, Type = String, Dynamic = False, Default = \"/genre/{0}/movies\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmisc_popular, Type = String, Dynamic = False, Default = \"/movie/popular\?page\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmisc_top_rated, Type = String, Dynamic = False, Default = \"/movie/top-rated\?page\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmisc_upcoming, Type = String, Dynamic = False, Default = \"/movie/upcoming\?page\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_alternative_titles, Type = String, Dynamic = False, Default = \"/movie/{0}/alternative_titles\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_casts, Type = String, Dynamic = False, Default = \"/movie/{0}/casts\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_images, Type = String, Dynamic = False, Default = \"/movie/{0}/images\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_info, Type = String, Dynamic = False, Default = \"/movie/{0}\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_keywords, Type = String, Dynamic = False, Default = \"/movie/{0}/keywords\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_releases, Type = String, Dynamic = False, Default = \"/movie/{0}/releases\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_similar, Type = String, Dynamic = False, Default = \"/movie/{0}/similar_movies\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_trailers, Type = String, Dynamic = False, Default = \"/movie/{0}/trailers\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_translations, Type = String, Dynamic = False, Default = \"/movie/{0}/translations\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLperson_credits, Type = String, Dynamic = False, Default = \"/person/{0}/credits\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLperson_images, Type = String, Dynamic = False, Default = \"/person/{0}/images\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLperson_info, Type = String, Dynamic = False, Default = \"/person/{0}\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLsearch_companies, Type = String, Dynamic = False, Default = \"/search/company\?query\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLsearch_movie, Type = String, Dynamic = False, Default = \"/search/movie\?query\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLsearch_person, Type = String, Dynamic = False, Default = \"/search/person\?query\x3D{0}&api_key", Scope = Protected #tag EndConstant #tag Constant, Name = URLtomatoes_lists_box_office, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json\?apikey\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLtomatoes_movie, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_alias, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movie_alias.json\?type\x3Dimdb&id\x3D{0}&apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_cast, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}/cast.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_clips, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}/clips.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_reviews, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}/reviews.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_similiar, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}/similar.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_search, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies.json\?q\x3D{0}&apikey\x3D", Scope = Private #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Address" Visible=true Group="Behavior" Type="String" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="defaultPort" Group="Behavior" InitialValue="0" Type="integer" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="httpProxyAddress" Group="Behavior" Type="string" EditorType="MultiLineEditor" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="httpProxyPort" Group="Behavior" InitialValue="0" Type="integer" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="Index" Visible=true Group="ID" Type="Integer" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Port" Visible=true Group="Behavior" InitialValue="0" Type="Integer" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="ShowProgress" Group="Behavior" InitialValue="False" Type="Boolean" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="yield" Group="Behavior" InitialValue="0" Type="boolean" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag EndViewBehavior End Class #tag EndClass \ No newline at end of file +#tag Class Protected Class MovieSckt Inherits HTTPSocket #tag Event Sub Error(code as integer) If CommonCore.MassSearch Then CommonCore.UnfoundTitles.Append "HTTP Error: " + str(code) + " occured." CommonCore.UnfoundPaths.Append MovieAttr.FolderParent End If SocketError( code, Me ) Exception err as NilObjectException Me.Close End Sub #tag EndEvent #tag Event Sub ReceiveProgress(bytesReceived as integer, totalBytes as integer, newData as string) Dim Progress as String = BytesToString( bytesReceived ) + Loc.k1of2 + BytesToString( totalBytes ) dlgProgress.Debug( Progress ) End Sub #tag EndEvent #tag Method, Flags = &h0 Sub GetArt(ID as String, Title as String) Dim Info as String = "GetArt( " + ID + ", " + Title + " ) - " Dim Sckt as New MovieSckt Dim JSONString as String Dim CacheID as String = MovieAttr.ID_IMDB If CacheID = "" Then CacheID = MovieAttr.ID_TMDB Dim Lang as String = Prefs.stringForKey("DBLanguage") If Lang = "gb" Then Lang = "en" Dim TimeOut as Integer = Prefs.integerForKey("TimeOut") Dim Count as Integer = 1 If NOT CommonCore.MassSearch Then dlgProgress.Reset Else Count = -1 End If Dim bFanartTV as Boolean = Prefs.boolForKey("AutoDownloadClearArt") Or _ Prefs.boolForKey("AutoDownloadLogo") Or _ Prefs.boolForKey("AutoDownloadDiscArt") Or _ Prefs.boolForKey("AutoDownloadThumb") Or _ Prefs.boolForKey("AutoDownloadBanner") Or _ Prefs.boolForKey("AutoDownloadBackdrop") If NOT Prefs.boolForKey("FanartTVEnabled") Then bFanartTV = False Dim bTMDB as Boolean = Prefs.boolForKey("AutoDownloadBackdrop") OR Prefs.boolForKey("AutoDownloadPoster") // :1 ## Get TMDB Info App.ErrorMessage = Info + "Get TMDB Info" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", "[TMDB] " + Loc.kImages.Titlecase + " " + Loc.kReadingInfo.Lowercase + "...", Count, 12 ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kImages + " " + Loc.mTabInfo.Lowercase + "..." ) End If If bTMDB Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieImages", ID, Lang ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim TMDB_Art as New JSONItem If bTMDB And JSONString.ValidJSON( "TMDB Art" ) Then TMDB_Art.Load( JSONString ) JSONString = "" Dim TMDB_Backdrops as New JSONItem Dim TMDB_Posters as New JSONItem If TMDB_Art <> Nil And TMDB_Art.HasName("backdrops") Then TMDB_Backdrops = TMDB_Art.Child("backdrops") If TMDB_Art <> Nil And TMDB_Art.HasName("posters") Then TMDB_Posters = TMDB_Art.Child("posters") Count = Count +1 // :2 ## FanartTV If bFanartTV Then App.ErrorMessage = Info + "Get FanartTV Info" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", "[Fanart.TV] " + Loc.kImages.Titlecase + " " + Loc.kReadingInfo.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kImages + " " + Loc.mTabInfo.Lowercase + "..." ) End If If bFanartTV Then JSONString = Trim( DefineEncoding( Sckt.Get( URLCore.FanartTV( ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) Sckt.Close 'If JSONString <> "" Then 'Dim FirstBracketLoc as Integer = JSONString.InStr( 2, "{" ) 'JSONString = JSONString.Right( JSONString.Len - FirstBracketLoc + 1) 'End If Dim FanartTV as New JSONItem If bFanartTV And JSONString.ValidJSON( "FanartTV" ) Then FanartTV.Load( JSONString ) JSONString = "" Dim FanartTV_Logos as New JSONItem Dim FanartTV_HDLogos as New JSONItem Dim FanartTV_ClearArt as New JSONItem Dim FanartTV_HDClearArt as New JSONItem Dim FanartTV_Thumb as New JSONItem Dim FanartTV_Banner as New JSONItem Dim FanartTV_Disc as New JSONItem Dim FanartTV_Fanart as New JSONItem If FanartTV.HasName("movielogo") Then FanartTV_Logos = FanartTV.Child("movielogo") If FanartTV.HasName("hdmovielogo") Then FanartTV_HDLogos = FanartTV.Child("hdmovielogo") If FanartTV.HasName("movieart") Then FanartTV_ClearArt = FanartTV.Child("movieart") If FanartTV.HasName("hdmovieclearart") Then FanartTV_HDClearArt = FanartTV.Child("hdmovieclearart") If FanartTV.HasName("moviethumb") Then FanartTV_Thumb = FanartTV.Child("moviethumb") If FanartTV.HasName("moviebanner") Then FanartTV_Banner = FanartTV.Child("moviebanner") If FanartTV.HasName("moviedisc") Then FanartTV_Disc = FanartTV.Child("moviedisc") If FanartTV.HasName("moviebackground") Then FanartTV_Fanart = FanartTV.Child("moviebackground") Count = Count +1 // :3 ## Posters App.ErrorMessage = Info + "Get TMDb Posters" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kPoster + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kPoster + " " + Loc.kImage.Lowercase + "..." ) End If If TMDB_Posters <> Nil Then Dim FirstPosterURL as String For i as Integer = 0 to TMDB_Posters.Count -1 Dim jItem as New JSONItem jItem = TMDB_Posters.Child(i) If jItem.Value("file_path") = "" Then Continue If FirstPosterURL = "" And ( jItem.Value("iso_639_1") = Lang OR jItem.Value("iso_639_1") = "" ) Then FirstPosterURL = URLbase_image + Prefs.stringForKey( "PosterSize" ) + jItem.Value("file_path") End If MovieAttr.ART_PosterURLs.Append URLbase_image + "original" + jItem.Value("file_path") MovieAttr.ART_PosterThumbURLs.Append URLbase_image + "w92" + jItem.Value("file_path") MovieAttr.ART_PosterDimensions.Append jItem.Value("width") + "x" + jItem.Value("height") Next // First Poster Dim DestPoster as FolderItem = MovieAttr.DestinationPoster( MovieAttr.FolderParent ) If FirstPosterURL = "" And MovieAttr.ART_PosterURLs.Ubound > -1 Then FirstPosterURL = MovieAttr.ART_PosterURLs(0) If Prefs.boolForKey("AutoDownloadPoster") And FirstPosterURL <> "" And DestPoster <> Nil And NOT DestPoster.Exists Then MovieAttr.ART_Poster = URL2Picture( FirstPosterURL, DestPoster.Parent, DestPoster.Name ) CacheImageSet( MovieAttr.ART_Poster, CacheID + ".movie.poster.jpg" ) End If End If Count = Count + 1 // :4 ## Backdrops App.ErrorMessage = Info + "Get TMDb Backdrops" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kFanart + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kFanart + " " + Loc.kImage.Lowercase + "..." ) End If // TMDB Fanarts Dim FirstBackdropURL as String If TMDB_Backdrops <> Nil Then For i as Integer = 0 to TMDB_Backdrops.Count -1 Dim jItem as New JSONItem jItem = TMDB_Backdrops.Child(i) If jItem.Value("file_path") = "" Then Continue If FirstBackdropURL = "" And ( jItem.Value("iso_639_1") = Lang OR jItem.Value("iso_639_1") = "" ) Then FirstBackdropURL = URLbase_image + Prefs.stringForKey( "FanartSize" ) + jItem.Value("file_path") End If MovieAttr.ART_FanartURLs.Append URLbase_image + "original" + jItem.Value("file_path") MovieAttr.ART_FanartThumbURLs.Append URLbase_image + "w300" + jItem.Value("file_path") MovieAttr.ART_FanartDimensions.Append jItem.Value("width") + "x" + jItem.Value("height") Next End If // FanartTV Fanarts App.ErrorMessage = Info + "Get FanartTV Fanarts" If FanartTV_Fanart <> Nil Then For i as Integer = 0 to FanartTV_Fanart.Count -1 MovieAttr.ART_FanartURLs.Append FanartTV_Fanart.Child(i).Value("url") MovieAttr.ART_FanartThumbURLs.Append FanartTV_Fanart.Child(i).Value("url") + "/preview" MovieAttr.ART_FanartDimensions.Append "1920x1080" Next End If // First Fanart Dim DestFanart as FolderItem = MovieAttr.DestinationFanart( MovieAttr.FolderParent ) If FirstBackdropURL= "" And MovieAttr.ART_FanartURLs.Ubound > -1 Then FirstBackdropURL = MovieAttr.ART_FanartURLs(0) If Prefs.boolForKey("AutoDownloadBackdrop") And FirstBackdropURL <> "" And DestFanart <> Nil And NOT DestFanart.Exists Then MovieAttr.ART_Poster = URL2Picture( FirstBackdropURL, DestFanart.Parent, DestFanart.Name ) CacheImageSet( MovieAttr.ART_Poster, CacheID + ".movie.fanart.jpg" ) End If Count = Count + 1 // :5 ## First Logo App.ErrorMessage = Info + "Get Logos" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kLogo + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kLogo + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadLogo") And NOT MovieAttr.FolderParent.Child("logo.png").Exists Then Dim FirstLogo as String if FanartTV_HDLogos <> Nil And FanartTV_HDLogos.Count > 0 Then For i as Integer = 0 to FanartTV_HDLogos.Count -1 If FirstLogo = "" And FanartTV_HDLogos.Child(i).Value("lang") = Lang Then FirstLogo = FanartTV_HDLogos.Child(i).Value("url") Next 'if FirstLogo = "" Then FirstLogo = FanartTV_HDLogos.Child(0).Value("url") End If If FanartTV_Logos <> Nil And FanartTV_Logos.Count > 0 Then For i as Integer = 0 to FanartTV_Logos.Count -1 If FirstLogo = "" And FanartTV_Logos.Child(i).Value("lang") = Lang Then FirstLogo = FanartTV_Logos.Child(i).Value("url") Next End If 'If FirstLogo = "" Then FirstLogo = FanartTV_Logos.Child(0).Value("url") If FirstLogo = "" And FanartTV_HDLogos <> Nil And FanartTV_HDLogos.Count > 0 Then FirstLogo = FanartTV_HDLogos.Child(0).Value("url") If FirstLogo = "" And FanartTV_Logos <> Nil And FanartTV_Logos.Count > 0 Then FirstLogo = FanartTV_Logos.Child(0).Value("url") If FirstLogo <> "" Then URL2Picture( FirstLogo, MovieAttr.FolderParent, "logo.png" ) End If Count = Count + 1 // :6 ## First ClearArt App.ErrorMessage = Info + "Get ClearArt" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kClearArt + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kClearArt + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadClearArt") And NOT MovieAttr.FolderParent.Child("clearart.png").Exists Then Dim FirstClearArt as String If FanartTV_HDClearArt <> Nil And FanartTV_HDClearArt.Count > 0 Then For i as Integer = 0 to FanartTV_HDClearArt.Count -1 If FirstClearArt = "" And FanartTV_HDClearArt.Child(i).Value("lang") = Lang Then FirstClearArt = FanartTV_HDClearArt.Child(i).Value("url") Next End If If FirstClearArt = "" And FanartTV_ClearArt <> Nil And FanartTV_ClearArt.Count > 0 Then For i as Integer = 0 to FanartTV_ClearArt.Count -1 If FirstClearArt = "" And FanartTV_ClearArt.Child(i).Value("lang") = Lang Then FirstClearArt = FanartTV_ClearArt.Child(i).Value("url") Next 'If FirstClearArt = "" Then FirstClearArt = FanartTV_ClearArt.Child(0).Value("url") End If If FirstClearArt = "" And FanartTV_HDClearArt <> Nil And FanartTV_HDClearArt.Count > 0 Then FirstClearArt = FanartTV_HDClearArt.Child(0).Value("url") If FirstClearArt = "" And FanartTV_ClearArt <> Nil And FanartTV_ClearArt.Count > 0 Then FirstClearArt = FanartTV_ClearArt.Child(0).Value("url") If FirstClearArt <> "" Then URL2Picture( FirstClearArt, MovieAttr.FolderParent, "clearart.png" ) End If Count = Count + 1 // :7 ## First Thumb App.ErrorMessage = Info + "Get Thumb" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kThumb + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kThumb + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadThumb") And NOT MovieAttr.FolderParent.Child("landscape.jpg").Exists Then Dim FirstThumb as String If FanartTV_Thumb <> Nil And FanartTV_Thumb.Count > 0 Then For i as Integer = 0 to FanartTV_Thumb.Count -1 If FirstThumb = "" And FanartTV_Thumb.Child(i).Value("lang") = Lang Then FirstThumb = FanartTV_Thumb.Child(i).Value("url") Next If FirstThumb = "" Then FirstThumb = FanartTV_Thumb.Child(0).Value("url") End If If FirstThumb <> "" Then URL2Picture( FirstThumb, MovieAttr.FolderParent, "landscape.jpg" ) End If Count = Count + 1 // :8 ## First Banner App.ErrorMessage = Info + "Get Banner" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kBanner + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kBanner + " " + Loc.kImage.Lowercase + "..." ) End If Dim BannerFile as FolderItem = FindImageBanner( MovieAttr.FolderParent ) If BannerFile = Nil Then BannerFile = MovieAttr.DestinationBanner( MovieAttr.FolderParent ) If Prefs.boolForKey("AutoDownloadBanner") And NOT BannerFile.Exists Then Dim FirstBanner as String If FanartTV_Banner <> Nil And FanartTV_Banner.Count > 0 Then For i as Integer = 0 to FanartTV_Banner.Count -1 If FirstBanner = "" And FanartTV_Banner.Child(i).Value("lang") = Lang Then FirstBanner = FanartTV_Banner.Child(i).Value("url") Next If FirstBanner = "" Then FirstBanner = FanartTV_Banner.Child(0).Value("url") End If If FirstBanner <> "" Then URL2Picture( FirstBanner, BannerFile.Parent, BannerFile.Name ) End If Count = Count + 1 // :9 ## First Disc App.ErrorMessage = Info + "Get DiscArt" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kDiscArt + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kDiscArt + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadDiscArt") And NOT MovieAttr.FolderParent.Child("disc.png").Exists Then Dim FirstDisc as String If FanartTV_Disc <> Nil And FanartTV_Disc.Count > 0 Then For i as Integer = 0 to FanartTV_Disc.Count -1 If FirstDisc = "" And FanartTV_Disc.Child(i).Value("lang") = Lang Then FirstDisc = FanartTV_Disc.Child(i).Value("url") Next If FirstDisc = "" Then FirstDisc = FanartTV_Disc.Child(0).Value("url") End If If FirstDisc <> "" Then URL2Picture( FirstDisc, MovieAttr.FolderParent, "disc.png" ) End If Count = Count + 1 // :10 ## ExtraThumbs App.ErrorMessage = Info + "Get ExtraThumbs" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kExtraThumbs + " " + Loc.kImages.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kExtraThumbs + " " + Loc.kImages.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadExtraThumbs") And MovieAttr.FolderParent <> Nil ANd MovieAttr.FolderParent.Exists And MovieAttr.FolderParent.IsWriteable And NOT MovieAttr.FolderParent.FolderError Then Dim Destination as FolderItem = MovieAttr.FolderParent.Child("extrathumbs") If NOT Destination.Exists And DestFanart.IsWriteable And NOT DestFanart.FolderError Then Destination.CreateAsFolder Dim n as Integer = 0 Dim Total as Integer = 0 If Destination <> Nil And Destination.Exists And MovieAttr.ART_FanartURLs <> Nil And MovieAttr.ART_FanartURLs.Ubound > -1 Then For i as Integer = 0 to MovieAttr.ART_FanartURLs.Ubound If MovieAttr.ART_FanartURLs(i).InStr( 0, "original" ) > 0 Then Total = Total + 1 Next For i as Integer = 0 to MovieAttr.ART_FanartURLs.Ubound If Prefs.integerForKey( "MaxThumbs" ) > 0 And i = Prefs.integerForKey( "MaxThumbs" ) Then Exit Dim Max as Integer = MovieAttr.ART_FanartURLs.Ubound + 1 If Prefs.integerForKey( "MaxThumbs" ) > 0 And Prefs.integerForKey( "MaxThumbs" ) < Max Then Max = Prefs.integerForKey( "MaxThumbs" ) If i > Max Then Exit dlgProgress.Debug( Str( i + 1 ) + Loc.k1of2 + Str( Max ) + " " + Loc.kExtraThumbs + "..." ) If MovieAttr.ART_FanartURLs(i).InStr( 0, "original" ) = 0 Then Continue n = n + 1 If Destination.Child( "thumb" + str(n) + ".jpg" ).Exists Then Continue If MovieAttr.ART_FanartURLs.Ubound > -1 Then URL2Picture( MovieAttr.ART_FanartURLs(i).ReplaceAll("original", "w780"), Destination, "thumb" + Str(n) + ".jpg" ) Next End If End If Count = Count + 1 // :11 ## ExtraFanart App.ErrorMessage = Info + "Get ExtraFanart" If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", Loc.kExtraFanarts + " " + Loc.kImage.Lowercase + "...", Count ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kExtraFanarts + " " + Loc.kImage.Lowercase + "..." ) End If If Prefs.boolForKey("AutoDownloadExtraFanart") Then Dim Destination as FolderItem = MovieAttr.FolderParent.Child("extrafanart") If NOT Destination.Exists Then Destination.CreateAsFolder If Destination <> Nil And Destination.Exists And MovieAttr.ART_FanartURLs <> Nil And MovieAttr.ART_FanartURLs.Ubound > -1 Then Dim Max as Integer = MovieAttr.ART_FanartURLs.Ubound + 1 If Prefs.integerForKey( "MaxBackdrops" ) > 0 And Prefs.integerForKey( "MaxBackdrops") < Max Then Max = Prefs.integerForKey( "MaxBackdrops" ) For i as Integer = 0 to MovieAttr.ART_FanartURLs.Ubound If i >= Max Then Exit dlgProgress.Debug( Str( i + 1 ) + Loc.k1of2 + Str( Max ) + " " + Loc.kExtraFanarts + "..." ) Dim Name() as String = MovieAttr.ART_FanartURLs(i).Split("/") If Name.Ubound = -1 Then Continue Dim FileName as String = Name( Name.Ubound ) If Destination.Child( FileName ).Exists Then Continue If MovieAttr.ART_FanartURLs.Ubound >= i Then URL2Picture( MovieAttr.ART_FanartURLs(i).ReplaceAll( "original", Prefs.stringForKey( "FanartSize" ) ), Destination ) Next End If End If End If // @END bFanartTV = True dlgProgress.Debug( "" ) App.ErrorMessage = "" End Sub #tag EndMethod #tag Method, Flags = &h0 Sub GetMovieNFO(ID as String, Update as Boolean = False) #pragma DisableBackgroundTasks #If NOT DebugBuild Then #pragma DisableBoundsChecking #pragma NilObjectChecking False #pragma StackOverflowChecking False #endif Dim Sckt as New MovieSckt Sckt.Yield = True 'Sckt.Anonymouse Dim rand as New Random Dim IP as String = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) Sckt.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) Sckt.SetRequestHeader( "User-agent", "Mozilla/" + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,3) ) + " (Windows NT " + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,2) ) + "; rv:2.0.1) Gecko/20100101 Firefox/" + Str( rand.InRange(3,5) ) + ".0.1" ) Dim MovieInfo as String = CurrentItemName + " " + Loc.mTabInfo.Lowercase + "..." // Temporary Save Dim PrevTitle, PrevTitleSort, PrevTitleOriginal, PrevSet, PrevSetOrder, PrevTagline, PrevRipSource as String dim prevGenres(), prevTags() as string Dim PrevWatchedStatus as Boolean = MovieAttr.StatusWatched App.ErrorMessage = "Update: " + Str( Update ) + " - Resetting properties." If Update Then PrevTitle = MovieAttr.Title PrevTitleSort = MovieAttr.TitleSort PrevTitleOriginal = MovieAttr.TitleOriginal PrevTagline = MovieAttr.DescriptionTagline for each genre as string in MovieAttr.Genres prevGenres.Append genre next for each tag as string in MovieAttr.Tags prevTags.Append tag next PrevSet = MovieAttr.Set PrevSetOrder = Str( MovieAttr.SetOrder ) PrevWatchedStatus = MovieAttr.StatusWatched PrevRipSource = MovieAttr.RipSource End If MovieAttr.ClearProperties If Update Then MovieAttr.Title = PrevTitle MovieAttr.TitleSort = PrevTitleSort MovieAttr.TitleOriginal = PrevTitleOriginal MovieAttr.DescriptionTagline = PrevTagline MovieAttr.Genres = PrevGenres MovieAttr.Set = PrevSet MovieAttr.SetOrder = Val( PrevSetOrder ) MovieAttr.StatusWatched = PrevWatchedStatus MovieAttr.RipSource = PrevRipSource MovieAttr.Tags = PrevTags End If If NOT CommonCore.MassSearch Then dlgProgress.Reset App.ErrorMessage = "Update: " + Str( Update ) + " - Fathering Info" // ## Gathering Info Dim Lang as String = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) Dim TimeOut as Integer = Prefs.integerForKey("TimeOut") / 2 Dim JSONString as String = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb U.S." // :1 ## TMDB U.S. Info If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb] " + MovieInfo, 1, 20 ) Else dlgProgress.Debug( "[TMDb] " + MovieInfo ) JSONString = DefineEncoding( Sckt.Get( URL( "MovieInfo", ID, "en" ), TimeOut ), Encodings.UTF8 ) Sckt.Close // Got a valid response from TMDb? Dim TMDBValid as Boolean = ( JSONString.InStr( 0, "Invalid id - The pre-requisite id is invalid or not found" ) = 0 AND JSONString <> "" ) Dim TMDB_US as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb - Info" ) Then TMDB_US.Load( JSONString ) JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Localized: " + Lang // :2 ## TMDB Localized Info If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb Localised] " + MovieInfo ) Else dlgProgress.Debug( "[TMDb Localised] " + MovieInfo ) If TMDBValid And Lang <> "en" Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieInfo", ID, Lang ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim TMDB_Local as New JSONItem If TMDBValid And Lang <> "en" And JSONString.ValidJSON( "TMDb - Localised", True ) Then TMDB_Local.Load( JSONString ) JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Alternative Titles" // :3 ## TMDB Alternative Titles If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb Alt-Titles] " + MovieInfo ) Else dlgProgress.Debug( "[TDMB Alt-Titles] " + MovieInfo ) If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieAlternativeTitles", ID, "en" ), TimeOut), Encodings.UTF8 ) Sckt.Close Dim TMDB_AltTitles as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb Alt-Titles" ) Then TMDB_AltTitles.Load( JSONString ) JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Cast" // :4 ## TMDB Cast If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb Cast] " + MovieInfo ) Else dlgProgress.Debug( "[TMDb Cast] " + MovieInfo ) If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieCast", ID, "en" ), TimeOut), Encodings.UTF8 ) Sckt.Close Dim TMDB_Cast as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb Cast" ) Then TMDB_Cast.Load( JSONString ) JSONString = "" // :5 ## TMDb Images App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Releases" // :6 ## TMDb Releases If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDb Releases] " + MovieInfo ) Else dlgProgress.Debug( "[TMDb Releases] " + MovieInfo ) If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieReleases", ID, "en" ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim TMDB_Releases as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb Releases" ) Then TMDB_Releases.Load( JSONString ) JSONString = "" // :7 ## TMDB Trailers 'If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TMDB Trailers] " + MovieInfo ) Else dlgProgress.Debug( "[TMDB Trailers] " + MovieInfo ) 'If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieTrailers", ID, "en" ), TimeOut ), Encodings.UTF8 ) 'Sckt.Close ' 'Dim TMDB_Trailers as New JSONItem 'If TMDBValid And JSONString.ValidJSON( "TMDB Trailers" ) Then TMDB_Trailers.Load( JSONString ) 'JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - IMDb" // :8 ## IMDb If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[IMDb] " + MovieInfo ) Else dlgProgress.Debug( "[IMDb] " + MovieInfo ) Dim IMDbID as String = ID If TMDB_US.HasName("imdb_id") Then IMDbID = TMDB_US.Value("imdb_id") Dim IMDb as New JSONItem If IMDbID.Left(2) = "tt" Then IMDb = GetIMDbJSON( IMDbID ) Dim Tomatoes as New JSONItem If Prefs.boolForKey("RTEnabled") Then App.ErrorMessage = "Update: " + Str( Update ) + " - Rotten Tomatoes" // :9 ## Rotten Tomatoes If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[Rotten Tomatoes] " + MovieInfo ) Else dlgProgress.Debug( "[Rotten Tomatoes] " + MovieInfo ) If IMDbID.Left(2) = "tt" Then JSONString = Trim( DefineEncoding( Sckt.Get( URLCore.RottenTomatoes( IMDbID.ReplaceAll( "tt", "" ), "Alias" ), TimeOut ), Encodings.UTF8 ) ) Sckt.Close If JSONString <> "" and JSONString.Left(1) = "{" Then 'Dim FirstBracketLoc as Integer = JSONString.InStr(0, "{" ) 'JSONString = Trim( JSONString.Right( JSONString.Len - FirstBracketLoc + 1) ) If JSONString.ValidJSON( "Rotten Tomatoes" ) Then Tomatoes.Load( JSONString ) End If End If JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - Recommendations" // :10 ## Recommendations If Prefs.stringForKey("MediaPlayer") <> "YAMJ" And Prefs.boolForKey("GetRecommendations") Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[" + Loc.kRecMovies + "] " + MovieInfo ) Else dlgProgress.Debug( "[" + Loc.kRecMovies + "] " + MovieInfo ) If Prefs.boolForKey("RTEnabled") And Prefs.boolForKey("RTRecsEnabled") Then App.ErrorMessage = "Update: " + Str( Update ) + " - RottenTomatoes Recommendations" // RottenTomatoes If Tomatoes <> Nil And Tomatoes.HasName("id") And Tomatoes.Value("id") <> "" Then dlgProgress.Debug( "Rotten Tomatoes " + Loc.kRecMovies + "..." ) JSONString = DefineEncoding( Sckt.Get( URLCore.RottenTomatoes( Tomatoes.Value("id"), "Recommendations" ), TimeOut), Encodings.UTF8 ) Sckt.Close Dim TomatoesRecommendations as New JSONItem If JSONString.ValidJSON("RT Recommendations") Then TomatoesRecommendations.Load( JSONString ) JSONString = "" If TomatoesRecommendations <> Nil And TomatoesRecommendations.HasName("movies") Then For i as Integer = 0 to TomatoesRecommendations.Child("movies").Count -1 Dim jItem as New JSONItem jItem = TomatoesRecommendations.Child("movies").Child(i) If jItem.HasName("title") And jItem.HasName("alternate_ids") And jItem.Child("alternate_ids").HasName("imdb") Then MovieAttr.RecMovies.Append jItem.Value("title") MovieAttr.RecMoviesIDs.Append "tt" + jItem.Child("alternate_ids").Value("imdb")' + " RottenTomatoes" MovieAttr.RecMoviesSources.Append "RottenTomatoes" End If Next End If End If End If App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Recommendations" // TMDB Recommendations If Prefs.integerForKey("TMDBRecommendations") > -1 Then If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieRecommendations", ID, Lang ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim TMDB_Recommendations As New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb Recommendations" ) Then TMDB_Recommendations.Load( JSONString ) JSONString = "" Dim Pages as Integer = -1 If TMDB_Recommendations.HasName("total_pages") Then Pages = TMDB_Recommendations.Value("total_pages") If Prefs.integerForKey("TMDBRecommendations") <> 0 And Pages > Prefs.integerForKey("TMDBRecommendations") Then Pages = Prefs.integerForKey("TMDBRecommendations") dlgProgress.Debug( "1" + Loc.k1of2 + Str( Pages ) + " Pages of TMDb " + Loc.kRecMovies ) // Process Page 1 If TMDB_Recommendations.HasName("results") And TMDB_Recommendations.Count > 0 Then For i as Integer = 0 to TMDB_Recommendations.Child("results").Count -1 Dim jItem as New JSONItem If TMDB_Recommendations.Child("results").Value(i) <> Nil Then jItem = TMDB_Recommendations.Child("results").Value(i) Else Continue MovieAttr.RecMovies.Append jItem.Value("title") MovieAttr.RecMoviesIDs.Append jItem.Value("id") MovieAttr.RecMoviesSources.Append "TMDB" Next End If // Process Page 2+ If Prefs.integerForKey("TMDBRecommendations") > 1 Or Prefs.integerForKey("TMDBRecommendations") = 0 Then If TMDB_Recommendations.HasName("total_pages") Then For i as Integer = 2 To Pages dlgProgress.Debug( Str( i ) + Loc.k1of2 + Str( Pages ) + " " + Loc.kRecMovies ) App.ErrorMessage = "Update: " + Str( Update ) + " - TMDb Recommendations Page " + Str( i ) + " of " + Str( Pages ) JSONString = "" If TMDBValid Then JSONString = DefineEncoding( Sckt.Get( URL( "MovieRecommendations", ID, Lang, i ), TimeOut ), Encodings.UTF8 ) Sckt.Close Dim RecommendedPage as New JSONItem If TMDBValid And JSONString.ValidJSON( "TMDb " + Loc.kRecMovies + " " + Str( i ) ) Then RecommendedPage.Load( JSONString ) JSONString = "" // Process Page results If RecommendedPage <> Nil And RecommendedPage.HasName("results") And RecommendedPage.Child("results").Count > 0 Then For n as Integer = 0 to RecommendedPage.Child("results").Count - 1 Dim jItem as New JSONItem If RecommendedPage.Child("results").Value(n) <> Nil Then jItem = RecommendedPage.Child("results").Value(n) Else Continue If jItem.HasName("title") And jItem.HasName("id") Then MovieAttr.RecMovies.Append jItem.Value("title") MovieAttr.RecMoviesIDs.Append jItem.Value("id") MovieAttr.RecMoviesSources.Append "TMDB" End If Next End If Next End If // @END RecommendedPages End If // @END Prefs.integerForKey("TMDBRecommendations") > 1 End If // @END Prefs.integerForKey("TMDBRecommendations") > 0 App.ErrorMessage = "Update: " + Str( Update ) + " - IMDb Recommendations" // IMDb Recommendations If IMDb <> Nil And IMDb.HasName("RECOMMENDATIONS") Then dlgProgress.Debug( "IMDb " + Loc.kRecMovies + "..." ) For i as Integer = 0 to IMDb.Child("RECOMMENDATIONS").Count -1 Dim RecTitle as String = Trim( RegExThis( IMDb.Child("RECOMMENDATIONS").Value(i), "\[.*\]", "" ) ) Dim RecID as String = Trim( RegExThis( IMDb.Child("RECOMMENDATIONS").Value(i), ".*\[", "" ) ).ReplaceAll("]","") If RecTitle = "" Then RecTitle = Loc.kNotAvailable MovieAttr.RecMovies.Append RecTitle MovieAttr.RecMoviesIDs.Append RecID MovieAttr.RecMoviesSources.Append "IMDb" Next End If JSONString = "" App.ErrorMessage = "Update: " + Str( Update ) + " - TraktTV Recommendations" If ID <> "" And Prefs.stringForKey("Trakttv_Password") <> "" And Prefs.stringForKey("Trakttv_UserName") <> "" Then 'And Prefs.boolForKey("TraktTVEnabled") Then dlgProgress.Debug( "TraktTV " + Loc.kRecMovies + "..." ) Dim TraktTV as New JSONItem JSONString = Sckt.Get( URLCore.TraktTV( "MovieRelated", ID ), 30 ) If JSONString.ValidJSON("TraktTV", True) Then TraktTV.Load JSONString If TraktTV <> Nil And TraktTV.IsArray Then For i as Integer = 0 to TraktTV.Count -1 Dim jItem as New JSONItem jItem = TraktTV.Child(i) If jItem <> Nil And jItem.HasName("title") And jItem.Value("title") <> "" And ( jItem.HasName("imdb_id") OR jItem.HasName("tmdb_id") ) Then MovieAttr.RecMovies.Append jItem.Value("title") If jItem.HasName("imdb_id") and jItem.Value("imdb_id") <> "" Then MovieAttr.RecMoviesIDs.Append jItem.Value("imdb_id") ElseIf jItem.HasName("tmdb_id") And jItem.Value("tmdb_id") <> "" Then MovieAttr.RecMoviesIDs.Append jItem.Value("tmdb_id") Else MovieAttr.RecMoviesIDs.Append "" End If MovieAttr.RecMoviesSources.Append "Trakt.tv" End If Next End If End If End If // @END NOT YAMJ & Get Recommendations dlgProgress.Debug("") // ## ---- Process Information App.ErrorMessage = "Update: " + Str( Update ) + " - Process Information" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kReadingInfo + ":", MovieInfo ) Else dlgProgress.Debug( Loc.kProcessing + " " + MovieInfo ) If Lang = "en-gb" Then Lang = "GB" If Lang.InStr(0, "en") > 0 Then Lang = "US" Else Lang = Lang.Uppercase Dim IMDbEnabled as Boolean = ( IMDb <> Nil And Trim( IMDb.ToString ) <> "" ) // ## ID's App.ErrorMessage = "Update: " + Str( Update ) + " - Process IDs" If IMDbID.Left(2) = "tt" Then MovieAttr.ID_IMDB = IMDbID If TMDB_US.HasName("id") Then MovieAttr.ID_TMDB = TMDB_US.Value("id") If Tomatoes <> Nil And Tomatoes.HasName("id") Then MovieAttr.ID_RottenTomatoes = Tomatoes.Value("id") // ## Title App.ErrorMessage = "Update: " + Str( Update ) + " - Process Title" If NOT Update OR Trim( MovieAttr.Title ) = "" Then If TMDB_US <> Nil And TMDB_US.HasName("title") And TMDB_US.Value("title") <> "" Then MovieAttr.Title = TMDB_US.Value("title") 'If ( Lang <> "US" And Lang <> "GB" And MovieAttr.Title = "" ) or MovieAttr.Title = "" Then If MovieAttr.Title = "" And IMDb <> Nil And IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then MovieAttr.Title = IMDb.Value("TITLE") 'End If If TMDB_Local <> Nil And TMDB_Local.HasName("title") And TMDB_Local.Value("title") <> "" Then MovieAttr.Title = TMDB_Local.Value("title") End If // ## Localized Title App.ErrorMessage = "Update: " + Str( Update ) + " - Process Localized Title" If NOT Update And Lang <> "US" And TMDB_AltTitles.HasName("titles") Then 'And Lang <> "GB" For i as Integer = 0 to TMDB_AltTitles.Child("titles").Count -1 Dim jItem as New JSONItem jItem = TMDB_AltTitles.Child("titles").Child(i) If jItem.Value("iso_3166_1") = Lang And jItem.Value("title") <> "" Then MovieAttr.Title = jItem.Value("title") Exit End If Next End If // ## Original Title App.ErrorMessage = "Update: " + Str( Update ) + " - Process Original Title" If NOT Update OR Trim( MovieAttr.TitleOriginal ) = "" Then If TMDB_US.HasName("original_title") And TMDB_US.Value("original_title") <> "" Then MovieAttr.TitleOriginal = TMDB_US.Value("original_title") 'If Lang <> "US" And Lang <> "GB" And IMDb <> Nil And IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" And Len( IMDb.Value("TITLE") ) >= Len( MovieAttr.TitleOriginal ) Then MovieAttr.TitleOriginal = IMDb.Value("TITLE") If MovieAttr.TitleOriginal = "" And IMDb <> Nil And IMDb.HasName("ORIGINAL_TITLE") And IMDb.Value("ORIGINAL_TITLE") <> "" Then MovieAttr.TitleOriginal = IMDb.Value("ORIGINAL_TITLE") If MovieAttr.TitleOriginal = "" And MovieAttr.Title <> "" Then MovieAttr.TitleOriginal = MovieAttr.Title If MovieAttr.Title = "" And MovieAttr.TitleOriginal <> "" Then MovieAttr.Title = MovieAttr.TitleOriginal End If // ## Sort Title App.ErrorMessage = "Update: " + Str( Update ) + " - Process Sort Title" If NOT Update OR Trim( MovieAttr.TitleSort ) = "" Then MovieAttr.TitleSort = Articulator( MovieAttr.Title ) // ## Descriptions App.ErrorMessage = "Update: " + Str( Update ) + " - Process Descriptions" // -- Plot If TMDB_US.HasName("overview") And TMDB_US.Value("overview") <> "" Then MovieAttr.DescriptionPlot = TMDB_US.Value("overview") If TMDB_Local.HasName("overview") And TMDB_Local.Value("overview") <> "" Then MovieAttr.DescriptionPlot = TMDB_Local.Value("overview") // -- Tagline App.ErrorMessage = "Update: " + Str( Update ) + " - Process Tagline" If TMDB_US.HasName("tagline") and TMDB_US.Value("tagline") <> "" Then MovieAttr.DescriptionTagline = TMDB_US.Value("tagline") MovieAttr.DescriptionTaglines.Append TMDB_US.Value("tagline") End If If TMDB_Local.HasName("tagline") and TMDB_Local.Value("tagline") <> "" Then MovieAttr.DescriptionTagline = TMDB_Local.Value("tagline") MovieAttr.DescriptionTaglines.Append TMDB_Local.Value("tagline") End If // Extra Tagline(s) If IMDb <> Nil And IMDb.HasName("TAGLINES") Then For i as Integer = 0 to IMDb.Child("TAGLINES").Count -1 MovieAttr.DescriptionTaglines.Append Trim( RegExThis( IMDb.Child("TAGLINES").Value(i), "\[.*\]", "" ) ) Next End If MovieAttr.DescriptionTaglines = RemoveDuplicatesFromArray( MovieAttr.DescriptionTaglines ) If MovieAttr.DescriptionTagline = "" And MovieAttr.DescriptionTaglines.Ubound >= 0 Then MovieAttr.DescriptionTagline = MovieAttr.DescriptionTaglines(0) // -- Outline App.ErrorMessage = "Update: " + Str( Update ) + " - Process Outline" If Lang = "US" OR Lang = "GB" Then If IMDb <> Nil And IMDb.HasName("PLOT") And IMDb.Value("PLOT") <> "" And Len( IMDb.Value("PLOT") ) > Len( MovieAttr.DescriptionPlot ) Then MovieAttr.DescriptionPlot = IMDb.Value("PLOT") If IMDb <> Nil And IMDb.HasName("STORYLINE") And IMDb.Value("STORYLINE") <> "" And _ Len( IMDb.Value("STORYLINE") ) > Len( MovieAttr.DescriptionPlot ) Then MovieAttr.DescriptionPlot = IMDb.Value("STORYLINE") // In case the storyline has been shortened, get the full version. If IMDb <> Nil And IMDb.HasName("STORYLINES") And IMDb.Child("STORYLINES").Count > 0 And _ Len( IMDb.Child("STORYLINES").Value(0) ) > Len( MovieAttr.DescriptionPlot ) Then MovieAttr.DescriptionPlot = IMDb.Child("STORYLINES").Value(0) End If // If the outline hasn't been filled yet, take the localized plot, and shorten it. If MovieAttr.DescriptionOutline = "" And MovieAttr.DescriptionPlot <> "" Then Dim Outline as String = MovieAttr.DescriptionPlot Dim sx1 as Integer = Outline.InStr( 200, "." ) Dim sx2 as Integer = Outline.InStr( sx1, "." ) // catch a second sentence. If sx2 > 0 Then Outline = Trim( Outline.Left( sx2 ) ) + ".." ElseIf sx1 > 0 Then Outline = Trim( Outline.Left( sx1 ) ) + ".." End If MovieAttr.DescriptionOutline = Outline End If // ## Release Dates App.ErrorMessage = "Update: " + Str( Update ) + " - Process Release Dates" If TMDB_US.HasName("release_date") Then MovieAttr.DatePremiered = TMDB_US.Value("release_date") If TMDB_Local.HasName("release_date") Then MovieAttr.DatePremiered = TMDB_Local.Value("release_date") If MovieAttr.DatePremiered <> "" Then MovieAttr.DateYear = Val( MovieAttr.DatePremiered.Left(4) ) If Tomatoes <> Nil And Tomatoes.HasName("release_dates") And Tomatoes.Child("release_dates").HasName("dvd") Then MovieAttr.DateReleasedOnDVD = Tomatoes.Child("release_dates").Value("dvd") End If If IMDb <> Nil And IMDb.HasName("RELEASE_DATE") And IMDb.Value("RELEASE_DATE") <> "" And IMDb.Value("RELEASE_DATE") <> "False" Then MovieAttr.DatePremiered = _ IMDb.Value("RELEASE_DATE").Right(4) + "-" + _ // Year - Month2Int( Trim( RegExThis( IMDb.Value("RELEASE_DATE"), "[0-9]", "" ) ) ) + "-" + _ // Month - IMDb.Value("RELEASE_DATE").Left(2) // Day End If If IMDb <> Nil And IMDb.HasName("YEAR") And IMDb.Value("YEAR") <> "" THen MovieAttr.DateYear = IMDb.Value("YEAR") // ## MPAA App.ErrorMessage = "Update: " + Str( Update ) + " - Process MPAA" Dim MPAAExplanation as String If IMDb <> Nil And IMDb.HasName("MPAA_RATING") And IMDb.Value("MPAA_RATING").InStr( 0, " for " ) > 0 Then MPAAExplanation = Trim( RegExThis( IMDb.Value("MPAA_RATING"), "RATED.*for ", "" ) ) MPAAExplanation = Trim( MPAAExplanation.ReplaceAll("(re-rating on appeal)","").ReplaceAll("on appeal","") ) End If // TMDB Certifications App.ErrorMessage = "Update: " + Str( Update ) + " - Process TMDb Certifications" If TMDB_Releases.HasName("countries") Then Dim aCountries(), aMPAA() as String For i as Integer = 0 to TMDB_Releases.Child("countries").Count -1 Dim jItem as New JSONItem jItem = TMDB_Releases.Child("countries").Child(i) aCountries.Append jItem.Value("iso_3166_1") aMPAA.Append jItem.Value("certification") // U.S. If jItem.Value("iso_3166_1") = "US" Then If MovieAttr.DatePremiered = "" Then MovieAttr.DatePremiered = jItem.Value("release_date") If Trim( jItem.Value("certification") ) <> "" And MovieAttr.RatingMPAA = "" Then MovieAttr.RatingMPAA = MPAAFromCountry( jItem.Value("certification"), "US" ) End If // Local If jItem.Value("iso_3166_1") = Lang Then MovieAttr.DatePremiered = jItem.Value("release_date") If Trim( jItem.Value("certification") ) <> "" Then MovieAttr.RatingMPAA = MPAAFromCountry( jItem.Value("certification"), Lang ) End If Next // @END ReleaseCountries.count For i as Integer = 0 to aCountries.Ubound If aMPAA(i) <> "" Then MovieAttr.RatingCertification.Append FlagCountry( aCountries(i) ) + ":" + aMPAA(i) Next End If // @END TMDB_Releases.HasName("countries") // IMDb Certifications App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Certifications" If IMDb <> Nil And IMDb.HasName("CERTIFICATIONS") Then For i as Integer = 0 To IMDb.Child("CERTIFICATIONS").Count -1 MovieAttr.RatingCertification.Append IMDb.Child("CERTIFICATIONS").Value(i) Next End If MovieAttr.RatingCertification = RemoveDuplicatesFromArray( MovieAttr.RatingCertification ) If MovieAttr.RatingMPAA = "" And IMDb <> Nil And IMDb.HasName("MPAA_RATING") Then MovieAttr.RatingMPAA = Trim( IMDb.Value("MPAA_RATING").Left( IMDb.Value("MPAA_RATING").InStrB( 0, " for " ) ) ) MovieAttr.RatingMPAA = MovieAttr.RatingMPAA.ReplaceAll("on appeal","") End If // String 'em up together If MPAAExplanation <> "" And MovieAttr.RatingMPAA <> "" Then MovieAttr.RatingMPAA = MovieAttr.RatingMPAA + " for " + MPAAExplanation + "." // ## Rating App.ErrorMessage = "Update: " + Str( Update ) + " - Process Ratings" If Prefs.stringForKey("PreferredRatings").Contains("TMDb") OR MovieAttr.Rating <= 0 Then If TMDB_US.HasName("vote_average") Then MovieAttr.Rating = Round( TMDB_US.Value( "vote_average" ) * 10 ) / 10 If TMDB_US.HasName("vote_count") Then MovieAttr.RatingVotes = TMDB_US.Value("vote_count") End If If Prefs.stringForKey("PreferredRatings").Contains("IMDb") OR Prefs.stringForKey("PreferredRatings") = "" OR MovieAttr.Rating <= 0 Then If IMDb <> Nil And IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then MovieAttr.Rating = IMDb.Value("RATING") If IMDb <> Nil And IMDb.HasName("VOTES") And IMDb.Value("VOTES") <> "" Then MovieAttr.RatingVotes = Val( IMDb.Value("VOTES").ReplaceAll(",","") ) End If // Top250 App.ErrorMessage = "Update: " + Str( Update ) + " - Process Top250" If IMDb <> Nil And IMDb.HasName("TOP_250") And IMDb.Value("TOP_250") > 0 Then MovieAttr.RatingTop250 = IMDb.Value("TOP_250") // ## Genres App.ErrorMessage = "Update: " + Str( Update ) + " - Process Genres" Dim TmpArray() as String If TMDB_Local.HasName("genres") Then TmpArray = JSONArray( TMDB_Local.Child("genres"), "name" ) ElseIf TMDB_US.HasName("genres") Then TmpArray = JSONArray( TMDB_US.Child("genres"), "name" ) End If For i as Integer = 0 to TmpArray.Ubound MovieAttr.Genres.Append TmpArray(i) Next If IMDb <> Nil Then If IMDbEnabled And IMDb.HasName("GENRES") And ( Lang = "US" OR Lang = "GB" ) Then TmpArray = JSONArray( IMDb.Child("GENRES") ) For i as Integer = 0 to TmpArray.Ubound MovieAttr.Genres.Append TmpArray(i).ReplaceAll("Sci-Fi", "Science-Fiction") Next End If End If // Sort out doubles. MovieAttr.Genres = RemoveDuplicatesFromArray( MovieAttr.Genres ) // All Caps for Boxee If Prefs.stringForKey("MediaPlayer") = "Boxee" Then For i as Integer = 0 To MovieAttr.Genres.Ubound MovieAttr.Genres(i) = MovieAttr.Genres(i).Uppercase Next End If // ## Studios App.ErrorMessage = "Update: " + Str( Update ) + " - Process Studios" If Tomatoes <> Nil And Tomatoes.HasName("studio") And Tomatoes.Value("studio") <> "" Then MovieAttr.Studios.Append Tomatoes.Value("studio") If TMDB_US.HasName("production_companies") Then MovieAttr.Studios = JSONArray( TMDB_US.Child("production_companies"), "name" ) If IMDb <> Nil And IMDb.HasName("STUDIOS") Then For i as Integer = 0 to IMDb.Child("STUDIOS").Count -1 MovieAttr.Studios.Append IMDb.Child("STUDIOS").Value(i) Next End If MovieAttr.Studios = RemoveDuplicatesFromArray( MovieAttr.Studios ) // ## Countries App.ErrorMessage = "Update: " + Str( Update ) + " - Process Countries" If TMDB_US.HasName("production_countries") Then MovieAttr.Countries = JSONArray( TMDB_US.Child("production_countries"), "name" ) If IMDb <> Nil And IMDb.HasName("COUNTRY") Then For i as Integer = 0 to IMDb.Child("COUNTRY").Count -1 MovieAttr.Countries.Append IMDb.Child("COUNTRY").Value(i) Next End If MovieAttr.Countries = RemoveDuplicatesFromArray( MovieAttr.Countries ) // ## Spoken Languages App.ErrorMessage = "Update: " + Str( Update ) + " - Process Spoken Languages" If TMDB_US.HasName("spoken_languages") Then MovieAttr.LanguagesSpoken = JSONArray( TMDB_US.Child("spoken_languages"), "name" ) MovieAttr.LanguagesSpokenCode = JSONArray( TMDB_US.Child("spoken_languages"), "iso_639_1" ) End If If IMDb <> Nil And IMDb.HasName("LANGUAGE") Then For i as Integer = 0 to IMDb.Child("LANGUAGE").Count -1 MovieAttr.LanguagesSpoken.Append IMDb.Child("LANGUAGE").Value(i) Next End If MovieAttr.LanguagesSpoken = RemoveDuplicatesFromArray( MovieAttr.LanguagesSpoken ) // ## Runtime App.ErrorMessage = "Update: " + Str( Update ) + " - Process Runtime" If TMDB_US.HasName("runtime") Then MovieAttr.InfoRuntime = Val( TMDB_US.Value("runtime").ReplaceAll("Min","").ReplaceAll("Minutes","") ) // ## IMDb Stars App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Stars" If IMDb <> Nil And IMDb.HasName("STARS") Then MovieAttr.ActorStar = JSONArray( IMDb.Child("STARS") ) // ## Cast App.ErrorMessage = "Update: " + Str( Update ) + " - Process Cast" If IMDb <> Nil And IMDb.HasName("CAST") And IMDb.HasName("ROLES") And IMDb.HasName("CASTTHUMBS") Then App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Cast" For i as Integer = 0 to IMDb.Child("CAST").Count -1 // Search cast ID if available. If TMDB_Cast.HasName("cast") Then Dim b as Boolean = False For n as Integer = 0 to TMDB_Cast.Child("cast").Count -1 If TMDB_Cast.Child("cast").Child(n).Value("name") = IMDb.Child("CAST").Value(i) Then MovieAttr.ActorID.Append TMDB_Cast.Child("cast").Child(n).Value("id") b = True Exit End If Next If NOT b Then MovieAttr.ActorID.Append "" Else MovieAttr.ActorID.Append "" End If MovieAttr.ActorName.Append IMDb.Child("CAST").Value(i) MovieAttr.ActorRole.Append IMDb.Child("ROLES").Value(i) MovieAttr.ActorThumbURL.Append IMDb.Child("CASTTHUMBS").Value(i) Next ElseIf TMDB_Cast.HasName("cast") Then App.ErrorMessage = "Update: " + Str( Update ) + " - Process TMDb Cast" For i as Integer = 0 to TMDB_Cast.Child("cast").Count - 1 Dim jItem as New JSONItem jItem = TMDB_Cast.Child("cast").Child(i) MovieAttr.ActorID.Append jItem.value("id") MovieAttr.ActorName.Append jItem.Value("name") MovieAttr.ActorRole.Append jItem.Value("character") If jItem.Value("profile_path") = "" Then MovieAttr.ActorThumbURL.Append "" Else MovieAttr.ActorThumbURL.Append URLbase_image + "w342" + jItem.Value("profile_path") Next End If // ## Crew App.ErrorMessage = "Update: " + Str( Update ) + " - Process TMDb Crew" Dim TmpDirectors(), TmpWriters(), TmpCamera() as String If TMDB_Cast.HasName("crew") Then For i as Integer = 0 to TMDB_Cast.Child("crew").Count -1 Dim jItem as New JSONItem jItem = TMDB_Cast.Child("crew").Child(i) If jItem.Value("department") = "Directing" Then TmpDirectors.Append jItem.Value("name") If jItem.Value("department") = "Writing" Then TmpWriters.Append jItem.Value("name") If jItem.Value("department") = "Camera" Then TmpCamera.Append jItem.Value("name") If jItem.Value("department") = "Sound" OR jItem.Value("department") = "Music" Then If MovieAttr.CreditMusic = "" Then MovieAttr.CreditMusic = jItem.Value("name") Else MovieAttr.CreditMusic = MovieAttr.CreditMusic + ", " + jItem.Value("name") End If End If Next // @END Crew.Count End If // @END Crew // IMDb Directors App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Directors" If IMDb <> Nil And IMDb.HasName("DIRECTORS") Then For i as Integer = 0 to IMDb.Child("DIRECTORS").Count -1 TmpDirectors.Append IMDb.Child("DIRECTORS").Value(i) Next End If // IMDb Writers App.ErrorMessage = "Update: " + Str( Update ) + " - Process IMDb Writers" If IMDb <> Nil And IMDb.HasName("WRITERS") Then For i as Integer = 0 to IMDb.Child("WRITERS").Count -1 TmpWriters.Append IMDb.Child("WRITERS").Value(i) Next End If TmpDirectors = RemoveDuplicatesFromArray( TmpDirectors ) TmpWriters = RemoveDuplicatesFromArray( TmpWriters ) TmpCamera = RemoveDuplicatesFromArray( TmpCamera ) For i as Integer = 0 to TmpDirectors.Ubound If MovieAttr.CreditDirector = "" Then MovieAttr.CreditDirector = TmpDirectors(i) Else MovieAttr.CreditDirector = MovieAttr.CreditDirector + ", " + TmpDirectors(i) End If Next For i as Integer = 0 to TmpWriters.Ubound If MovieAttr.CreditWriter = "" Then MovieAttr.CreditWriter = TmpWriters(i) Else MovieAttr.CreditWriter = MovieAttr.CreditWriter + ", " + TmpWriters(i) End If Next For i as Integer = 0 to TmpCamera.Ubound If MovieAttr.CreditCamera = "" Then MovieAttr.CreditCamera = TmpCamera(i) Else MovieAttr.CreditCamera = MovieAttr.CreditCamera + ", " + TmpCamera(i) End If Next // ## RottenTomatoes If Prefs.boolForKey("RTEnabled") And Prefs.boolForKey("RTRatingsEnabled") Then App.ErrorMessage = "Update: " + Str( Update ) + " - Process Rotten Tomatoes Critics" If Tomatoes <> Nil And Tomatoes.HasName("critics_consensus") Then MovieAttr.TomatoConcensus = Tomatoes.Value("critics_consensus") If Tomatoes <> Nil And Tomatoes.HasName("ratings") Then Dim jItem as New JSONItem jItem = Tomatoes.Child("ratings") If jItem.HasName("critics_rating") Then MovieAttr.TomatoCriticsRating = jItem.Value("critics_rating") If jItem.HasName("critics_score") Then MovieAttr.TomatoCriticsScore = jItem.Value("critics_score") If Prefs.stringForKey("PreferredRatings").Contains("Tomato") And Prefs.stringForKey("PreferredRatings").Contains("Critics") And MovieAttr.TomatoCriticsScore > 0 Then MovieAttr.RatingVotes = -1 MovieAttr.Rating = ( MovieAttr.TomatoCriticsScore / 10 ) End If If jItem.HasName("audience_rating") Then MovieAttr.TomatoAudienceRating = jItem.Value("audience_rating") If jItem.HasName("audience_score") Then MovieAttr.TomatoAudienceScore = jItem.Value("audience_score") If Prefs.stringForKey("PreferredRatings").Contains("Tomato") And Prefs.stringForKey("PreferredRatings").Contains("Audience") And MovieAttr.TomatoAudienceScore > 0 Then MovieAttr.RatingVotes = -1 MovieAttr.Rating = ( MovieAttr.TomatoAudienceScore / 10 ) End If End If End If // ## Download actor images. App.ErrorMessage = "Update: " + Str( Update ) + " - Download Actor Images" If Prefs.boolForKey("AutoDownloadActorThumbs") Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kActorThumbs + "..." ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kActorThumbs.Lowercase + "..." ) App.ErrorMessage = ID + " - Creating .actors folder" If NOT MovieAttr.FolderParent.Child(".actors").Exists Then MovieAttr.FolderParent.Child(".actors").CreateAsFolder App.ErrorMessage = ID + " - Remove pre-existing symlink folder" dim symdest as FolderItem = MovieAttr.FolderParent.Child("actors") symdest.Visible = True App.ErrorMessage = ID + " - Creating symlink folder" If SymLink( MovieAttr.FolderParent.Child( ".actors" ), MovieAttr.FolderParent.Child( "actors" ) ) Then // Created symlink End If App.ErrorMessage = ID + " - Getting actors folder" Dim ActorFolder as FolderItem = MovieAttr.FolderParent.Child(".actors") If ActorFolder = Nil OR NOT ActorFolder.Exists Then ActorFolder = MovieAttr.FolderParent.Child("actors") App.ErrorMessage = ID + " - Setting Max Actor Downloads" Dim Max as Integer = MovieAttr.ActorThumbURL.Ubound If Prefs.integerForKey("MaxActors") > 0 And Prefs.integerForKey("MaxActors") <= Max Then Max = Prefs.integerForKey("MaxActors") If ActorFolder <> Nil And ActorFolder.Exists Then For i as Integer = 0 to Max App.ErrorMessage = ID + " - Actor Name: " + MovieAttr.ActorName(i).ReplaceAll(":","") + " " + Str( i ) + " of " + Str( Max ) Dim ActorFile as FolderItem = ActorFolder.Child( MovieAttr.ActorName(i).ReplaceAll(":","").ReplaceAll(" ", "_") + ".jpg" ) If MovieAttr.ActorThumbURL(i) <> "" And MovieAttr.ActorName(i) <> "" And NOT ActorFile.Exists Then dlgProgress.Debug( "Downloading " + Str( i + 1 ) + Loc.k1of2 + Str( Max + 1 ) + " " + MovieAttr.ActorName(i) + " " + Loc.kThumb.Lowercase + "..." ) App.ErrorMessage = App.ErrorMessage + Chr(13) + "Downloading: " + MovieAttr.ActorThumbURL(i) + chr(13) + "Destionation: " + ActorFile.ShellPath.ReplaceAll("\","") URL2Picture( MovieAttr.ActorThumbURL(i), ActorFile.Parent, ActorFile.Name ) if ActorFile <> Nil and ActorFile.Exists then MovieAttr.ActorThumbURL(i) = ActorFile.ShellPath.ReplaceAll("\", "") end if 'If Sckt.Get( MovieAttr.ActorThumbURL(i), ActorFile, TimeOut ) Then 'MovieAttr.ActorThumbURL(i) = ActorFile.ShellPath.ReplaceAll( "\", "" ) 'Else 'Sckt.Close 'If ActorFile IsA FolderItem Then ActorFile.Delete 'End If 'Sckt.Close ElseIf ActorFile.Exists Then MovieAttr.ActorThumbURL(i) = ActorFile.ShellPath.ReplaceAll( "\", "" ) End If Next End If dlgProgress.Debug "" End If // ## Get Art App.ErrorMessage = "Update: " + Str( Update ) + " - Download Images" GetArt( ID, MovieAttr.Title ) // Get IMDb Poster App.ErrorMessage = "Update: " + Str( Update ) + " - Download IMDb Images" If IMDb <> Nil And IMDb.HasName("POSTER_FULL") And IMDb.Value("POSTER_FULL") <> "" And IMDb.Value("POSTER_FULL").InStr( 0, "scorecardresearch" ) = 0 Then MovieAttr.ART_PosterURLs.Append IMDb.Value("POSTER_FULL") MovieAttr.ART_PosterThumbURLs.Append IMDb.Value("POSTER_SMALL") MovieAttr.ART_PosterDimensions.Append "" Dim PosterDest as FolderItem = MovieAttr.DestinationPoster( MovieAttr.FolderParent ) If PosterDest <> Nil And NOT PosterDest.Exists And Prefs.boolForKey("AutoDownloadPoster") Then 'URL2Picture( IMDb.Value("POSTER_FULL"), MovieAttr.FolderParent, PosterDest.Name ) If Sckt.Get( IMDb.Value("POSTER_FULL"), PosterDest, TimeOut ) Then MovieAttr.ART_Poster = Picture.Open( PosterDest ) Sckt.Close End If End If // ## Trailer Links App.ErrorMessage = "Update: " + Str( Update ) + " - Process Trailers" Dim TrailerDict as Dictionary = MovieCore.MovieTrailers( ID ) // ## Write NFO App.ErrorMessage = "Update: " + Str( Update ) + " - Write NFO" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kMetadata + ":", Loc.kWritingNFO ) Else dlgProgress.Debug( Loc.kWritingNFO ) // 17 MovieAttr.NFOWrite( MovieAttr.DestinationNFO( MovieAttr.FolderParent ) ) // Download trailer App.ErrorMessage = "Update: " + Str( Update ) + " - Download Trailer" If Prefs.boolForKey("AutoDownloadTrailer") And TrailerDict <> Nil And FindTrailerItem( MovieAttr.FolderParent ) = Nil Then Dim FirstTrailerURL as String Dim TrailerURLs(), TrailerQualities() as String For each Key as Variant in TrailerDict.Keys 'If FirstTrailerURL = "" Then FirstTrailerURL = Key TrailerURLs.Append Key TrailerQualities.Append TrailerDict.Value( Key ) Next Dim pQuality as String = Prefs.stringForKey("TrailerQuality") Dim rQuality as String If pQuality = "1080p" Then rQuality = "Large" If pQuality = "720p" Then rQuality = "Medium" If pQuality = "480p" Then rQuality = "Small" If Prefs.stringForKey("TrailerSource") <> "" And pQuality <> "" Then Dim SelTrailerURLs(), SelTrailerQualities() as String // Filter on trailer source For i as Integer = 0 to TrailerURLs.Ubound If TrailerURLs(i).Contains( Prefs.stringForKey("TrailerSource") ) Then If FirstTrailerURL = "" Then FirstTrailerURL = TrailerURLs(i) SelTrailerURLs.Append TrailerURLs(i) SelTrailerQualities.Append TrailerQualities(i) End If Next // Filter on trailer qualities For i as Integer = SelTrailerURLs.Ubound DownTo 0 If NOT SelTrailerQualities(i).Contains( pQuality ) And NOT SelTrailerQualities(i).Contains( rQuality ) Then SelTrailerURLs.Remove(i) SelTrailerQualities.Remove(i) End If Next // Set most suitable trailer If SelTrailerURLs.Ubound >= 0 Then FirstTrailerURL = SelTrailerURLs(0) If FirstTrailerURL = "" And TrailerURLs.Ubound >= 0 Then // Trailer source not found, try remaining trailer's qualities. SelTrailerURLs = TrailerURLs SelTrailerQualities = TrailerQualities For i as Integer = SelTrailerURLs.Ubound DownTo 0 If NOT SelTrailerQualities(i).Contains( pQuality ) And NOT SelTrailerQualities(i).Contains( rQuality ) Then SelTrailerURLs.Remove(i) SelTrailerQualities.Remove(i) End If Next If SelTrailerURLs.Ubound >= 0 Then FirstTrailerURL = SelTrailerURLs(0) End If End If // @END TrailerSource & TrailerQuality // Fallback If FirstTrailerURL = "" And TrailerURLs.Ubound >= 0 Then FirstTrailerURL = TrailerURLs(0) If NOT CommonCore.MassSearch Then dlgProgress.Update( Loc.kDownloading + ":", MovieAttr.Title + " " + Loc.kTrailer.Lowercase + "...", 64, 100 ) Else dlgProgress.Debug( Loc.kDownloading + " " + MovieAttr.Title + " " + Loc.kTrailer.Lowercase + "..." ) End If Dim ScktTrailer as New TrailerSckt' = dlgProgress.ScktTrailer ScktTrailer.Yield = True IP = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) ScktTrailer.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) ScktTrailer.SetRequestHeader( "User-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Safari/8536.25" ) // For Apple trailers Dim TmpTrailerFile as FolderItem = SpecialFolder.Temporary.Child( App.Identifier ).Child("Trailer.part") // Download trailer If FirstTrailerURL <> "" And ScktTrailer.Get( FirstTrailerURL, TmpTrailerFile, 600 ) Then // Verify trailer file If TmpTrailerFile.Length > 1024 Then // Success! If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.MoveFileTo( MovieAttr.DestinationTrailer( MovieAttr.FolderParent, TmpTrailerFile ) ) End If Else // Failure... // Failure, try once more if possible. FirstTrailerURL = "" ScktTrailer.Close Dim Content as String If TmpTrailerFile IsA FolderItem Then Content = ReadTextFile( TmpTrailerFile ) If Content.InStr( 0, "The document has moved" ) > 0 Then FirstTrailerURL = Content.MyMid( "" ).ReplaceAll("&", "&") If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete If FirstTrailerURL <> "" And ScktTrailer.Get( FirstTrailerURL, TmpTrailerFile, 600 ) Then If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.MoveFileTo( MovieAttr.DestinationTrailer( MovieAttr.FolderParent, TmpTrailerFile ) ) Else If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete End If End If End If // @END TmpTrailerFile.length // Clean-up ScktTrailer.Close If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete End If // @END TrailerSckt.Get 'If Prefs.boolForKey("AutoDownloadTrailer") And MovieAttr.TrailerURLs.Ubound >= 0 And NOT FindTrailerItem( MovieAttr.FolderParent ) IsA FolderItem Then ' 'Dim FirstTrailerURL as String' = MovieAttr.TrailerURLs(0) 'Dim TrailerSelection(), TrailerQualities() as String ' 'If Prefs.stringForKey("TrailerSource") <> "" And Prefs.stringForKey("TrailerQuality") <> "" Then 'And Prefs.stringForKey("TrailerSource") <> "youtube.com" Then ' '// Get all trailers from selected source 'For i as Integer = 0 to MovieAttr.TrailerURLs.Ubound 'If MovieAttr.TrailerURLs(i).InStr( 0, Prefs.stringForKey("TrailerSource") ) > 0 Then 'TrailerSelection.Append MovieAttr.TrailerURLs(i) 'TrailerQualities.Append MovieAttr.TrailerQuality(i) 'End If 'Next ''If TrailerSelection.Ubound >= 0 Then FirstTrailerURL = TrailerSelection(0) // Set first likely trailer to be downloaded. ' 'If TrailerSelection.Ubound = -1 Then 'For i as Integer = 0 to MovieAttr.TrailerURLs.Ubound 'TrailerSelection.Append MovieAttr.TrailerURLs(i) 'TrailerQualities.Append MovieAttr.TrailerQuality(i) 'Next 'End If ''If TrailerSelection.Ubound >= 0 Then FirstTrailerURL = TrailerSelection(0) // Set first likely trailer to be downloaded. ' '// Remove all trailers that don't have the wanted quality. 'For i as Integer = TrailerSelection.Ubound DownTo 0 'If TrailerQualities(i) <> Prefs.stringForKey("TrailerQuality") And TrailerSelection(i).InStr( 0, "youtube" ) = 0 Then 'TrailerSelection.Remove(i) 'TrailerQualities.Remove(i) 'End If 'Next ' '// Set most suitable trailer to be downloaded 'For i as Integer = 0 to TrailerSelection.Ubound 'If TrailerSelection(i).InStr( 0, "youtube" ) > 0 Then 'Continue 'Else 'FirstTrailerURL = TrailerSelection(i) 'Exit 'End If 'Next 'If FirstTrailerURL = "" And TrailerSelection.Ubound >= 0 Then FirstTrailerURL = TrailerSelection(0) ''If TrailerSelection.Ubound >= 0 Then FirstTrailerURL = TrailerSelection(0) 'End If ' ' 'If NOT CommonCore.MassSearch Then 'dlgProgress.Update( Loc.kDownloading + ":", MovieAttr.Title + " " + Loc.kTrailer.Lowercase + "...", 64, 100 ) 'Else 'dlgProgress.Debug( Loc.kDownloading + " " + MovieAttr.Title + " " + Loc.kTrailer.Lowercase + "..." ) 'End If ' 'Dim ScktTrailer as New TrailerSckt 'ScktTrailer.Yield = False ' 'IP = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) 'ScktTrailer.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) 'ScktTrailer.SetRequestHeader( "User-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Safari/8536.25" ) ' ' 'If FirstTrailerURL.InStr( 0, "youtube" ) > 0 Then 'Dim YTContent as String = ScktTrailer.Get( MovieAttr.TrailerURLs(0), Prefs.integerForKey("TimeOut") ) ' ''Dim TrailerURL as String 'If YTContent <> "" Then FirstTrailerURL = ScktTrailer.YoutubeContent( YTContent, "", True ) 'End If ' ' 'Dim TmpTrailerFile as FolderItem = SpecialFolder.Temporary.Child( App.Identifier ).Child("Trailer.part") 'MovieAttr.FolderParent.Child("Trailer.part") ' 'If FirstTrailerURL <> "" And ScktTrailer.Get( FirstTrailerURL, TmpTrailerFile, 600 ) Then ' 'If TmpTrailerFile.Length > 1024 Then '// Success 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.MoveFileTo( MovieAttr.DestinationTrailer( MovieAttr.FolderParent, TmpTrailerFile ) ) ' ' 'Else '// Failure, try once more. 'FirstTrailerURL = "" 'ScktTrailer.Close 'Dim Content as String 'If TmpTrailerFile IsA FolderItem Then Content = ReadTextFile( TmpTrailerFile ) 'If Content.InStr( 0, "The document has moved" ) > 0 Then FirstTrailerURL = Content.MyMid( "" ).ReplaceAll("&", "&") ' 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete ' 'If FirstTrailerURL <> "" And ScktTrailer.Get( FirstTrailerURL, TmpTrailerFile, 600 ) Then 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.MoveFileTo( MovieAttr.DestinationTrailer( MovieAttr.FolderParent, TmpTrailerFile ) ) 'Else 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete 'End If ' 'End If ' 'Else ''If NOT CommonCore.MassSearch Then MessageBox "Trailer download failed!" 'End If ' 'ScktTrailer.Close 'If TmpTrailerFile <> Nil And TmpTrailerFile.Exists Then TmpTrailerFile.Delete 'End If // ## AutoManage Media App.ErrorMessage = "Update: " + Str( Update ) + " - AutoManage Media" If MovieAttr.RipSource = "" Then MovieAttr.RipSource = FindRipSource( MovieAttr.FolderParent ) If NOT CommonCore.MassSearch And Prefs.boolForKey("AutoManageMedia") Then SingleRenamer MovieAttr.FolderParent, -1, True // 18 End If Exception err as KeyNotFoundException Dim w as New wndBugReporter w.Init( err, App.ErrorMessage ) End Sub #tag EndMethod #tag Method, Flags = &h0 Function URL(Method As String, Parameter As String, Lang As String = "All", Page As Integer = 1, Opt As String = "") As String Dim ext as String Dim Base as String = URLbase Dim ApiKey as String = MovieCore.ApiKey_TMDB If Lang = "All" Then Lang = "" ElseIf Lang = "" Then Lang = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) Else Lang = Lang End If Select Case Method Case "MovieInfo" ext = URLmovie_info Lang = "&language=" + Lang Case "MovieAlternativeTitles" ext = URLmovie_alternative_titles If Lang <> "" Then Lang = "&language=" + Lang Case "MovieCast" ext = URLMovie_casts Case "MovieImages" ext = URLmovie_images Lang = "" Case "MovieReleases" ext = URLmovie_releases If Lang <> "" Then Lang = "&language=" + Lang Case "MovieTrailers" ext = URLmovie_trailers If Lang <> "" Then Lang = "&language=" + Lang Case "SearchMovie" ext = URLsearch_movie If Lang <> "" Then Lang = "&language=" + Lang if opt = "" then dim year as string year = match( "\([0-9][0-9][0-9][0-9]\)", Parameter ) if year = "" then year = match( "\[[0-9][0-9][0-9][0-9]\]", Parameter ) if year <> "" then Parameter = Parameter.ReplaceAll(year, "") opt = year.ReplaceAll("[","").ReplaceAll("]","") end if else Parameter = Parameter.ReplaceAll(year,"") opt = year.ReplaceAll("(","").ReplaceAll(")","") end if end if If Opt <> "" Then Opt = "&year=" + opt Parameter = String2Entities( Parameter ) Case "MovieRecommendations" ext = URLmovie_similar If Lang <> "" Then Lang = "&language=" + Lang // ---- RottenTomatoes Case "TomatoesSearch" ext = URLtomatoes_search Lang = "&country=" + Lang Opt = "&page_limit=" + Opt Case "TomatoesMovieInfo" ext = URLtomatoes_movie Lang = "" Case "TomatoesMovieAlias" ext = URLtomatoes_movie_alias Case "TomatoesMovieReviews" ext = URLtomatoes_movie_reviews Lang = "" Opt = "&page_limit=50&review_type=" + Opt // Review Types: "all", "top_critic" and "dvd". Default: "top_critic" Case "TomatoesMovieCast" Base = "" ext = URLtomatoes_movie_cast Lang = "" 'Lang = "&country=" + Lang Case "TomatoesMovieSimiliar" ext = URLtomatoes_movie_similiar Lang = "" Opt = "&limit=5" Case "TomatoesMovieClips" ext = URLtomatoes_movie_clips Lang = "" Case "TomatoesBoxOffice" ext = URLtomatoes_lists_box_office Lang = "&country=" + Lang Opt = "&limit=10" End Select Return Base + ext.ReplaceAll("{0}", Parameter ) + ApiKey + "&page=" + Str(Page) + Lang + Opt + "&include_adult=true" End Function #tag EndMethod #tag Note, Name = Image Sizes "images": { "backdrop_sizes": ["w300", "w780", "w1280", "original"], "base_url": "http://cf2.imgobject.com/t/p/", "poster_sizes": ["w92", "w154", "w185", "w342", "w500", "original"], "profile_sizes": ["w45", "w185", "h632", "original"] } Construction: URLbase_image + "{size}" + "image.jpg" #tag EndNote #tag Note, Name = Untitled Dim Lang as String = Prefs.stringForKey("DBLanguage") If Lang.InStr(0,"-") = 0 Then Lang = Lang + "-" + Lang If Lang = "en-en" Then Lang = "en" Dim test as JSONItem Dim Base as String = "http://api.themoviedb.org/3" Dim Extension as String Select Case url Case "misc_upcoming" Extension = "/movie/upcoming?page={0}&api_key=" End Select Return Base + Extension.ReplaceAll("{0}", prm) + ApiKey If ID.Left(2) = "tt" then // IMDB Lookup Return "http://api.themoviedb.org/2.1/Movie.imdbLookup/" + Lang + "/xml/" + ApiKey + "/" + ID Else // TMDB Lookup Return "http://api.themoviedb.org/2.1/Movie.getInfo/" + Lang + "/xml/" + ApiKey + "/" + ID End If #tag EndNote #tag Note, Name = URL Construction Return URLbase + URL*.ReplaceAll("{0}", "ID or Query") + ApiKey + "&page=" + "1+" + "&language=" URL search_* all have multi pages. URL top_rated/popular/upcoming all have (5) multi-pages. #tag EndNote #tag Property, Flags = &h0 ShowProgress As Boolean = False #tag EndProperty #tag Constant, Name = URLbase, Type = String, Dynamic = False, Default = \"http://api.themoviedb.org/3", Scope = Public #tag EndConstant #tag Constant, Name = URLbase_image, Type = String, Dynamic = False, Default = \"http://image.tmdb.org/t/p/", Scope = Public #tag EndConstant #tag Constant, Name = URLcompany_info, Type = String, Dynamic = False, Default = \"/company/{0}\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLcompany_movies, Type = String, Dynamic = False, Default = \"/company/{0}/movies\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLconfiguration, Type = String, Dynamic = False, Default = \"/configuration\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLgenre_list, Type = String, Dynamic = False, Default = \"/genre/list\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLgenre_movies, Type = String, Dynamic = False, Default = \"/genre/{0}/movies\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmisc_popular, Type = String, Dynamic = False, Default = \"/movie/popular\?page\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmisc_top_rated, Type = String, Dynamic = False, Default = \"/movie/top-rated\?page\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmisc_upcoming, Type = String, Dynamic = False, Default = \"/movie/upcoming\?page\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_alternative_titles, Type = String, Dynamic = False, Default = \"/movie/{0}/alternative_titles\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_casts, Type = String, Dynamic = False, Default = \"/movie/{0}/casts\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_images, Type = String, Dynamic = False, Default = \"/movie/{0}/images\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_info, Type = String, Dynamic = False, Default = \"/movie/{0}\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_keywords, Type = String, Dynamic = False, Default = \"/movie/{0}/keywords\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_releases, Type = String, Dynamic = False, Default = \"/movie/{0}/releases\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_similar, Type = String, Dynamic = False, Default = \"/movie/{0}/similar_movies\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_trailers, Type = String, Dynamic = False, Default = \"/movie/{0}/trailers\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLmovie_translations, Type = String, Dynamic = False, Default = \"/movie/{0}/translations\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLperson_credits, Type = String, Dynamic = False, Default = \"/person/{0}/credits\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLperson_images, Type = String, Dynamic = False, Default = \"/person/{0}/images\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLperson_info, Type = String, Dynamic = False, Default = \"/person/{0}\?api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLsearch_companies, Type = String, Dynamic = False, Default = \"/search/company\?query\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLsearch_movie, Type = String, Dynamic = False, Default = \"/search/movie\?query\x3D{0}&api_key\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLsearch_person, Type = String, Dynamic = False, Default = \"/search/person\?query\x3D{0}&api_key", Scope = Protected #tag EndConstant #tag Constant, Name = URLtomatoes_lists_box_office, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json\?apikey\x3D", Scope = Protected #tag EndConstant #tag Constant, Name = URLtomatoes_movie, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_alias, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movie_alias.json\?type\x3Dimdb&id\x3D{0}&apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_cast, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}/cast.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_clips, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}/clips.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_reviews, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}/reviews.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_movie_similiar, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies/{0}/similar.json\?apikey\x3D", Scope = Private #tag EndConstant #tag Constant, Name = URLtomatoes_search, Type = String, Dynamic = False, Default = \"http://api.rottentomatoes.com/api/public/v1.0/movies.json\?q\x3D{0}&apikey\x3D", Scope = Private #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Address" Visible=true Group="Behavior" Type="String" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="defaultPort" Group="Behavior" InitialValue="0" Type="integer" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="httpProxyAddress" Group="Behavior" Type="string" EditorType="MultiLineEditor" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="httpProxyPort" Group="Behavior" InitialValue="0" Type="integer" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="Index" Visible=true Group="ID" Type="Integer" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Port" Visible=true Group="Behavior" InitialValue="0" Type="Integer" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="ShowProgress" Group="Behavior" InitialValue="False" Type="Boolean" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="yield" Group="Behavior" InitialValue="0" Type="boolean" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag EndViewBehavior End Class #tag EndClass \ No newline at end of file diff --git a/ViMM/CoreServices/TVCore.rbbas b/ViMM/CoreServices/TVCore.rbbas old mode 100755 new mode 100644 index 1207e3a..be26cc0 --- a/ViMM/CoreServices/TVCore.rbbas +++ b/ViMM/CoreServices/TVCore.rbbas @@ -1 +1 @@ -#tag Module Protected Module TVCore #tag Method, Flags = &h0 Sub EpisodeUpdate(ID as String) If TVAttr.Locked Then MessageBox Loc.kIsLocked.ReplaceAll("%@", TVAttr.Title) Return End If Dim sckt as New TVDBSckt If ID.Left(2) = "tt" Then ID = sckt.IMDb2TVDB( ID ) End If Dim ShowName as String = TVAttr.Title If ShowName = "" Then ShowName = TVAttr.FolderParent.Name If ID = "" Then MessageBox loc.msgNoIDTV.ReplaceAll( "%S", ShowName ) Return End If Dim TVInfo as String = TVAttr.Title + " " + Loc.kEpisodes + "..." If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Info] " + TVInfo ) Else dlgProgress.debug( "[TVDB Info] " + TVInfo ) If ID.Left(2) <> "tt" Then Dim XMLString as String = DefineEncoding( sckt.Get( TVCore.URL( "Info", ID ), 60 ), Encodings.UTF8 ) 'XMLString = DecodingFromHTMLMBS( XMLString ) sckt.Close if XMLString.Contains("" then sckt.ProcessEpisodes XMLString else log "Invalid XML File for " + ID end if XMLString = "" End If If NOT CommonCore.MassSearch Then wndMain.lstTVShows.UpdateRow End Sub #tag EndMethod #tag Method, Flags = &h0 Sub GetThemeSong(Title as String, GetFirst as Boolean = True) If Trim( Title ) = "" Then Return Dim Sckt as New TVDBSckt // Normalize Title Title = Trim( RegExThis( Title, "\(.*?\)" ) ) Title = Title.ReplaceAll("'", "") If Title.Left(4) = "The " Then Title = Title.Replace( "The ","") If Title.Left(2) = "A " Then Title = Title.Replace( "A ", "" ) Title = Title.ReplaceAll( "&", " and " ) // Set starting positions Dim Page as Integer = 1 Dim URLs(), Rejects() as String Dim HTML as String = "Next" // Go through the pages. While HTML.InStr( 0, "Next" ) > 0 If DebugBuild Then dlgProgress.Debug( Loc.kProcessing + " TV Tunes page " + Str( Page ) ) HTML = sckt.Get( "http://www.televisiontunes.com/search.php?searWords=%22" + Title.ReplaceAll( " ", "+" ) + "%22&Send=Search&page=" + Str( Page ), Prefs.integerForKey("TimeOut") ) Sckt.Close HTML = HTML.MyMid( "
", "" ) '"" ) HTML = HTML.ReplaceAll("", "" ) Dim tmpURLs() as String = match_all( "", HTML ) For i as Integer = 0 to tmpURLs.Ubound If tmpURLs(i).InStr( 0, "search.php" ) > 0 Then Continue Dim Split() as String = tmpURLs(i).Split("/") Dim Name as String If Split.Ubound > 0 Then Name = Split( Split.Ubound ).ReplaceAll( "_", " " ) If Name.InStr( 0, " (The)" ) > 0 Then Name = "The " + Name.ReplaceAll( " (The)", "" ) Rejects.Append "http://www.televisiontunes.com/themesongs/" + Name.ReplaceAll(".html",".mp3").ReplaceAll(" ","%20") 'If Name.NthField( " - ", 1 ).InStr( 0, Title ) = 0 Then Continue // Don't pass Start, go directly to MP3. URLs.Append "http://www.televisiontunes.com/themesongs/" + Name.ReplaceAll(".html",".mp3").ReplaceAll(" ","%20") Next If HTML.InStr( 0, "Next" ) > 0 Then Page = Page + 1 Else Exit End If Wend 'URLs.SortWith 'If DebugBuild Then dlgProgress.Debug "" // Download first theme. If URLs.Ubound > -1 And GetFirst Then TVAttr.ThemeSongs = URLs Dim tmpTheme as FolderItem = SpecialFolder.Temporary.Child( App.Identifier ).Child("theme.mp3") If sckt.Get( URLs(0), tmpTheme, 800 ) Then If tmpTheme <> Nil And tmpTheme.Exists Then tmpTheme.MoveFileTo( TVAttr.FolderParent.Child("theme.mp3") ) Else 'MessageBox "Theme download failed!" End If Return ElseIf URLs.Ubound > -1 And NOT GetFirst Then wndItemChooser.Show If TVAttr.FolderParent.Child("theme.mp3").Exists Then wndItemChooser.lstResults.AddRow( "Local " + Loc.kThemeSong.Lowercase ) wndItemChooser.lstResults.RowTag( 0 ) = TVAttr.FolderParent.Child( "theme.mp3" ) End If For i as Integer = 0 to URLs.Ubound Dim Split() as String = URLs(i).Split("/") Dim Name as String = Trim( Split( Split.Ubound ).ReplaceAll(".mp3","").ReplaceAll("%20"," ") ) If Name.NthField( "-", 2 ) <> "" Then Name = Name.ReplaceAll( " - ", " / " ) Name = Name.ReplaceAll( "- ", " / " ) If Name.Left( Title.Len + 3 ) = Title + " / " Then Name = Name.Replace( Title + " / ", "" ) wndItemChooser.lstResults.AddRow( Trim( Name ) ) Else wndItemChooser.lstResults.AddRow( Trim( Name ) ) End If wndItemChooser.lstResults.RowTag( wndItemChooser.lstResults.ListCount -1 ) = URLs(i) Next If wndItemChooser.lstResults.ListCount > 0 Then wndItemChooser.lstResults.ListIndex = 0 ElseIf NOT GetFirst Then MessageBox Loc.kCouldNotBeFound.ReplaceAll( "%S", Loc.kThemeSongs ) End If End Sub #tag EndMethod #tag Method, Flags = &h0 Sub MissingShows() Dim sckt as New TVDBSckt sckt.Yield = True CommonCore.MassSearch = True ReDim CommonCore.UnFoundTitles(-1) ReDim CommonCore.UnfoundPaths(-1) Dim LstBox as Listbox = wndMain.lstTVShadow For i as Integer = 0 to LstBox.ListCount - 1 // If scraped before, skip it! If LstBox.Cell( i, 2 ) <> "" Then Continue // If TVAttr.FolderParent does not exist, Skip it! TVAttr.FolderParent = GetFolderItem( LstBox.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue Dim ShowTitle as String = TVAttr.FolderParent.Name // Search for show dlgProgress.Add( Loc.kSearching + ":", ShowTitle + "..." ) Dim XMLString as String = DefineEncoding( Sckt.Get( URL( "Search", ShowTitle.ReplaceAll( " - ", " " ) ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) Sckt.Close Dim SearchResults as New JSONItem SearchResults = XMLString.XML2JSON 'JSONString = JSONString.XML2JSON.ToString // If Invalid JSON, Skip it! If SearchResults = Nil Then 'NOT JSONString.ValidJSON( "TVDB" ) Then If NOT nc.Available Then If NOT Growl.Notify( Loc.FetchAllMetadata + ":", Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) ) Then // NOT Growling! End If Else nc.Message Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) End If CommonCore.UnFoundTitles.Append ShowTitle + chr(13) + "Invalid JSON returned from Server."' + chr(13) + TVAttr.FolderParent.ShellPath.ReplaceAll("\","") + JSONString CommonCore.UnfoundPaths.Append TVAttr.FolderParent Continue End If // Get ID if available. Dim ID as String 'SearchResults.Load( JSONString ) Dim MultipleResults as Boolean If SearchResults <> Nil And SearchResults.HasName("Data") And SearchResults.ToString.InStr( 0, "Series" ) > 0 And SearchResults.Child("Data").HasName("Series") Then If SearchResults.Child("Data").Child("Series").IsArray And SearchResults.Child("Data").Child("Series").Count >= 1 Then // Should I allow scrape if there's more then one result? TVDB is a bit unreliable. Dim IDs() as String For n as Integer = 0 to SearchResults.Child("Data").Child("Series").Count -1 Dim CurrentID as String = SearchResults.Child("Data").Child("Series").Child(n).Value("seriesid") If IDs = Nil OR IDs.Ubound < 0 Then IDs.Append CurrentID Else Dim b as Boolean = False For t as Integer = 0 to IDs.Ubound If IDs(t) = CurrentID Then b = True Exit End If Next If NOT b Then IDs.Append CurrentID End If Next MultipleResults = ( IDs.Ubound >= 1 ) If SearchResults.Child("Data").Child("Series").Child(0).HasName("seriesid") Then ID = SearchResults.Child("Data").Child("Series").Child(0).Value("seriesid") Else If SearchResults.Child("Data").Child("Series").HasName("seriesid") Then ID = SearchResults.Child("Data").Child("Series").Value("seriesid") End If End If // If there's no ID available, Skip it! If ID = "" Then If Not nc.Available Then If NOT Growl.Notify( Loc.FetchAllMetadata + ":", Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) ) Then End If Else nc.Message Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) End If CommonCore.UnfoundTitles.Append Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) CommonCore.UnfoundPaths.Append TVAttr.FolderParent Continue End If If NOT MultipleResults Then ShowByID( ID ) If Prefs.boolForKey("AutoManageMedia") Then SingleRenamer TVAttr.FolderParent, i, True Else wndMain.lstTVShows.UpdateRow i, Nil, True End If If MultipleResults And SearchResults <> Nil And SearchResults.HasName("Data") And SearchResults.Child("Data").HasName("Series") And SearchResults.Child("Data").Child("Series").IsArray Then 'And SearchResults <> Nil And SearchResults.Child("Data").Child("Series").HasName("SeriesName") Then Dim jItem as New JSONItem jItem = SearchResults.Child("Data").Child("Series").Child(0) If jItem.HasName("SeriesName") Then If jItem.HasName("FirstAired") Then CommonCore.UnfoundTitles.Append TVAttr.FolderParent.Name + chr(13) + Loc.kMultipleResultsFoundTV Else CommonCore.UnfoundTitles.Append TVAttr.FolderParent.Name + chr(13) + Loc.kMultipleResultsFoundTV End If End If CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If Next CommonCore.MassSearch = False wndMain.lstTVShows.SortList wndMain.lstTVShows.ResetFolderStatus MessageBox Loc.kDownloadComplete CommonCore.ShowUnfoundTitles( Loc.kCouldNotBeFoundFollowing.ReplaceAll( "%S", Loc.TVShows.Lowercase ) ) Return End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowArt(ID as String, Mode as String, Season as Integer = - 1) If ID = "" Then Return Dim SeasonStr as String = "All" If Season > -1 Then SeasonStr = Str( Season ) End If Dim Sckt as New TVDBSckt Dim JSONString as String Dim bTVDB as Boolean = False bTVDB = ( Mode = "Banners" OR Mode = "Posters" OR Mode = "Backdrops" OR Mode = "SeasonPoster" OR Mode = "SeasonBanner" ) Dim bFanartTV as Boolean = False bFanartTV = ( Mode = "Banners" OR Mode = "Posters" OR Mode = "Backdrops" OR Mode = "ClearArt" OR Mode = "Logos" OR Mode = "CharacterArt" OR Mode = "Thumbs" OR Mode = "SeasonThumb" OR Mode = "SeasonFanart" ) // ## TVDB Alias dlgProgress.Add( Loc.kDownloading + ":", Loc.kImages + " " + Loc.mTabInfo + "..." ) If bTVDB And ID.Left(2) = "tt" Then ID = Sckt.IMDb2TVDB( ID ) Dim Type as String // User friendly type // ## TVDBArt Dim TVDBArt as New JSONItem If bTVDB And ID.Left(2) <> "tt" Then dlgProgress.Add( Loc.kDownloading + ":", "TVDB" + " " + Loc.kImages + " " + Loc.mTabInfo + "..." ) JSONString = DefineEncoding( Sckt.Get( TVCore.URL( "Art", ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) Sckt.Close TVDBArt = JSONString.XML2JSON If TVDBArt.HasName("Banners") And TVDBArt.ToString.InStr("""Banner""") > 0 And TVDBArt.Child("Banners").HasName("Banner") Then TVDBArt = TVDBArt.Child("Banners").Child("Banner") End If JSONString = "" End If // ## FanartTV Dim FanartTV as New JSONItem If bFanartTV Then dlgProgress.Add( Loc.kDownloading + ":", "Fanart.TV" + " " + Loc.kImages + " " + Loc.mTabInfo + "..." ) JSONString = Trim( DefineEncoding( Sckt.Get( URLCore.FanartTV( ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) Sckt.Close 'Dim FirstBracketLoc as Integer' = JSONString.InStr(2, "{" ) 'JSONString = Trim( JSONString.Right( JSONString.Len - FirstBracketLoc + 1) ) If JSONString.ValidJSON("Fanart.TV") Then FanartTV.Load JSONString JSONString = "" End If Dim IMGArray() as Picture, Dimensions(), URLs(), ThumbURLs() as String Dim jItem as New JSONItem // Get URLs and dimensions If TVDBArt <> Nil And NOT TVDBArt.IsArray Then Dim jt as New JSONItem jt.Append( TVDBArt ) TVDBArt = jt End If // TVDB If TVDBArt <> Nil And TVDBArt.IsArray Then For i as Integer = 0 to TVDBArt.Count -1 jItem = TVDBArt.Child(i) If NOT jItem.HasName("BannerPath") OR jItem.Value("BannerPath") = "" Then Continue If ( jItem.Value( "BannerType" ) = "poster" And Mode = "Posters" ) OR _ jItem.Value( "BannerType" ) = "fanart" And Mode = "Backdrops" OR _ '( Mode = "TV-Backdrops" OR Mode = "SeasonFanart" ) OR _ ( jItem.Value( "BannerType" ) = "series" And Mode = "Banners" ) OR _ ( jItem.Value( "BannerType" ) = "season" And jItem.Value("BannerType2") = "season" And Mode = "SeasonPoster" ) OR _ ( jItem.Value( "BannerType" ) = "season" and jItem.Value("BannerType2") = "seasonwide" And Mode = "SeasonBanner" ) _ Then Dim Cache as String = "" If Mode.InStr( 0, "backdrop" ) > 0 OR Mode.InStr( 0, "poster" ) > 0 Then Cache = "_cache/" If Mode.InStr( 0, "Season" ) > 0 Then 'And Mode.InStr( 0, "SeasonFanart" ) = 0 Then If jItem.HasName("Season") And jItem.Value("Season") = SeasonStr Then ThumbURLs.Append TVCore.GraphicsPath + Cache + jItem.Value("BannerPath") Dimensions.Append jItem.Value("BannerType2") URLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") End If Else ThumbURLs.Append TVCore.GraphicsPath + Cache + jItem.Value("BannerPath") Dimensions.Append jItem.Value("BannerType2") URLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") End If End If Next End If Dim SeasonName as String jItem = Nil Select Case Mode Case "Posters" Type = Loc.kPoster if FanartTV <> Nil and FanartTV.HasName("tvposter") then jItem = FanartTV.Child("tvposter") for i as Integer = 0 to jItem.Count -1 if jItem.Child(i).Lookup("url", "" ) <> "" then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "1000x1426" ThumbURLs.Append Replace( jItem.Child(i).Value("url"), "/fanart/", "/preview/" ) end if next end if // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("poster.jpg").Exists Then TVAttr.ART_Poster = URL2Picture( URLs(0), TVAttr.FolderParent, "poster.jpg" ) 'URL2Picture( URLs(0), "poster", "jpg", TVAttr.FolderParent ) CacheImageSet( TVAttr.ART_Poster, TVAttr.ID_IMDb + ".television.poster.jpg" ) wndMain.cvsTVShowDetails.Reload Return End If Case "Backdrops" Type = Loc.kFanart // fanarttv if FanartTV <> Nil and FanartTV.HasName("showbackground") Then jItem = FanartTV.Child("showbackground") for i as Integer = 0 to jItem.Count -1 if jItem.Child(i).Lookup("url", "") <> "" then urls.Append jItem.Child(i).Value("url") Dimensions.Append "1920x1080" ThumbURLs.Append Replace( jItem.Child(i).Value("url"), "/fanart/", "/preview/" ) end if // @END if jItem.Child(i).Value("url") <> "" next // @END each jItem.Child end if // @END FanartTV <> Nil // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("fanart.jpg").Exists Then TVAttr.ART_Fanart = URL2Picture( URLs(0), TVAttr.FolderParent, "fanart.jpg" ) 'URL2Picture( URLs(0), "fanart", "jpg", TVAttr.FolderParent ) CacheImageSet( TVAttr.ART_Fanart, TVAttr.ID_IMDb + ".television.fanart.jpg" ) wndMain.cvsTVShowDetails.Reload Return End If Case "Banners" Type = Loc.kBanner If FanartTV <> Nil ANd FanartTV.HasName("tvbanner") Then jItem = FanartTV.Child("tvbanner") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "1000x185" ThumbURLs.Append jItem.Child(i).Value("url") 'ThumbURLs.Append Replace( jItem.Child(i).Value("url"), "/fanart/", "/preview/" ) End If Next End If // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("banner.jpg").Exists Then TVAttr.ART_Banner = URL2Picture( URLs(0), TVAttr.FolderParent, "banner.jpg" ) 'URL2Picture( URLs(0), "banner", "jpg", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "Logos" Type = Loc.kLogo // HDTV Logo URLs If FanartTV <> Nil ANd FanartTV.HasName("hdtvlogo") Then jItem = FanartTV.Child("hdtvlogo") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "800x310" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // Logo URLs If FanartTV <> Nil ANd FanartTV.HasName("clearlogo") Then jItem = FanartTV.Child("clearlogo") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "400x155" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("logo.png").Exists Then TVAttr.ART_Logo = URL2Picture( URLs(0), TVAttr.FolderParent, "logo.png" ) 'URL2Picture( URLs(0), "logo", "png", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "ClearArt" Type = Loc.kClearArt // HD ClearArt URLs If FanartTV <> Nil ANd FanartTV.HasName("hdclearart") Then jItem = FanartTV.Child("hdclearart") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "1000x562" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // ClearArt URLs If FanartTV <> Nil ANd FanartTV.HasName("clearart") Then jItem = FanartTV.Child("clearart") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "500x281" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("clearart.png").Exists Then TVAttr.ART_ClearArt = URL2Picture( URLs(0), TVAttr.FolderParent, "clearart.png" ) 'URL2Picture( URLs(0), "clearart", "png", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "CharacterArt" Type = Loc.kCharacterArt // CharacterArt URLs If FanartTV <> Nil ANd FanartTV.HasName("characterart") Then jItem = FanartTV.Child("characterart") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "512x512" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("character.png").Exists Then TVAttr.ART_ClearArt = URL2Picture( URLs(0), TVAttr.FolderParent, "character.png" ) 'URL2Picture( URLs(0), "character", "png", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "Thumbs" Type = Loc.kTVThumb // CharacterArt URLs If FanartTV <> Nil ANd FanartTV.HasName("tvthumb") Then jItem = FanartTV.Child("tvthumb") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "500x281" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("landscape.jpg").Exists Then TVAttr.ART_TVThumb = URL2Picture( URLs(0), TVAttr.FolderParent, "landscape.jpg" ) 'URL2Picture( URLs(0), "landscape", "jpg", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "SeasonPoster" Type = Loc.kSeason + " " + Loc.kPoster SeasonName = "season%S-poster.jpg" If Season = 0 Then SeasonName = "season-specials-poster.jpg" If Season < 0 Then SeasonName = "season-all-posters.jpg" Case "SeasonBanner" Type = Loc.kSeason + " " + Loc.kBanner SeasonName = "season%S-banner.jpg" If Season = 0 Then SeasonName = "season-specials-banner.jpg" If Season < 0 Then SeasonName = "season-all-banner.jpg" Case "SeasonThumb" Type = Loc.kSeason + " " + Loc.kTVThumb SeasonName = "season%S-landscape.jpg" If Season = 0 Then SeasonName = "season-specials-landscape.jpg" If Season < 0 Then SeasonName = "season-all-landscape.jpg" // SeasonThumb URLs If FanartTV <> Nil ANd FanartTV.HasName("seasonthumb") Then jItem = FanartTV.Child("seasonthumb") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" And jItem.Child(i).Value("season") = SeasonStr Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "500x281" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If Case "SeasonFanart" Type = Loc.kSeason + " " + Loc.kFanart SeasonName = "season%S-fanart.jpg" If Season = 0 Then SeasonName = "season-specials-fanart.jpg" If Season < 0 Then SeasonName = "season-all-fanart.jpg" // Season Fanart URLs If FanartTV <> Nil And FanartTV.HasName("showbackground") Then jItem = FanartTV.Child("showbackground") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" And jItem.Child(i).Value("season") = SeasonStr Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "1920x1080" ThumbURLs.Append jItem.Child(i).Value("url") + "/preview" End If Next End If End Select // Season Location If URLs.Ubound = 0 And Mode.InStr( 0, "Season" ) > 0 Then 'If Season = -1 Then Season = 1 Dim DisplaySeason as String = Str( Season ) If DisplaySeason.Len = 1 Then DisplaySeason = "0" + DisplaySeason Dim Parent as FolderItem = TVAttr.FolderParent 'If Season = 0 And Parent.Child( "Specials" ).Exists Then 'Parent = Parent.Child("Specials") 'ElseIf Season > 0 And Parent.Child( "Season " + DisplaySeason ).Exists Then 'Parent = Parent.Child( "Season " + DisplaySeason ) 'ElseIf Season = -1 And Parent.Child( TVAttr.Title ).Exists Then 'Parent = Parent.Child( TVAttr.Title ) 'End If If NOT Parent.Child( SeasonName.ReplaceAll("%S", DisplaySeason ) ).Exists Then URL2Picture( URLs(0), Parent, SeasonName.ReplaceAll( "%S", DisplaySeason ) ) Return End If End If // Download image thumbs. dlgProgress.Reset For i as Integer = 0 to ThumbURLs.Ubound dlgProgress.Add( Loc.kDownloading + ":", Str( i + 1 ) + Loc.k1of2 + Str( ThumbURLs.Ubound + 1 ) + " " + Type + " " + Loc.kImages + "...", 1, ThumbURLs.Ubound + 1) IMGArray.Append Picture.FromData( Sckt.Get( ThumbURLs(i), Prefs.integerForKey("TimeOut") ) ) Sckt.Close If IMGArray(i) <> Nil And val( Dimensions(i).ReplaceAll("x","") ) <= 0 Then Dimensions(i) = Str( IMGArray(i).Width ) + "x" + Str( IMGArray(i).Height ) Next If IMGArray = Nil Or IMGArray.Ubound <= -1 Then MessageBox MovieCore.kNoImagesFound.ReplaceAll( "%S", Type ) wndMain.cvsTVShowDetails.Reload Return End If wndPreviewThumbs.Init IMGArray, Dimensions, URLs, Mode, Season End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowByID(ID as String, Update as Boolean = False) If TVAttr.Locked Then MessageBox Loc.kIsLocked.ReplaceAll("%@", TVAttr.Title) Return End If Dim sckt as New TVDBSckt sckt.Yield = True Dim ShowName as String = TVAttr.FolderParent.Name If ID = "" Then MessageBox loc.msgNoIDTV.ReplaceAll( "%S", ShowName ) Return End If // Reset current search. If NOT CommonCore.MassSearch Then wndMain.ccSearchBoxTVShows.edtSearch.Text = "" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kSearching + ":", ShowName, 1, 5 ) // 1 'MessageBox ID sckt.getShowNFO( ID, Update ) If NOT CommonCore.MassSearch Then wndMain.lstTVShows.UpdateRow TVAttr.NFORead( TVAttr.FolderParent ) TVAttr.LoadImages( TVAttr.FolderParent ) 'wndMain.lstTVShows.SortList() wndMain.cvsTVShowDetails.Reload() End If Return End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowSearch(ShowName as String, ManualSearch as Boolean = False) Dim sckt as New TVDBSckt Dim JSONString as String dlgProgress.Add( Loc.kSearching + ":", ShowName ) JSONString = DefineEncoding( sckt.Get( URL( "Search", ShowName.ReplaceAll( " - ", " " ) ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close Dim jTVDB as New JSONItem jTVDB = JSONString.ConvertEncoding( Encodings.UTF8 ).XML2JSON Dim Results as New JSONItem If jTVDB <> Nil ANd jTVDB.HasName("Data") And jTVDB.ToString.InStr( "Series" ) > 0 And jTVDB.Child("Data").HasName("Series") And jTVDB.Child("Data").Child("Series").Count > 0 Then Dim IDs() as String Dim TVShows() as JSONItem If jTVDB.Child("Data").Child("Series").IsArray Then For i as Integer = 0 to jTVDB.Child("Data").Child("Series").Count -1 TVShows.Append jTVDB.Child("Data").Child("Series").Child(i) Next Else TVShows.Append jTVDB.Child("Data").Child("Series") End If For each jItem as JSONItem in TVShows 'If jItem.HasName("language") And jItem.Value("language") <> Prefs.stringForKey("DBLanguage") Then Continue 'For i as Integer = 0 to jTVDB.Child("Data").Child("Series").Count -1 'Dim jItem as New JSONItem 'If jTVDB.Child("Data").Child("Series").IsArray Then 'jItem = jTVDB.Child("Data").Child("Series").Child(i) 'Else 'jItem = jItem.Child("Data").Child("Series") 'End If // Skip duplicates with different IDs If jItem.HasName("SeriesName") And jItem.Value("SeriesName").InStr( "* duplicate of" ) > 0 Then Continue // Skip Duplicats with same IDs Dim b as Boolean = False For n as Integer = 0 to IDs.Ubound If jItem.HasName("id") and jItem.Value("id") = IDs(n) Then b = True Exit End If Next If b Then Continue // Find duplicate entries in my language. Dim EnglishItem as New JSONItem Dim LocalizedItem as New JSONItem Dim BackUpItem as New JSONItem For n as Integer = 0 to TVShows.Ubound 'jTVDB.Child("Data").Child("Series").Count -1 Dim ThisItem as New JSONItem ThisItem = TVShows(n) 'jTVDB.Child("Data").Child("Series").Child(n) If ThisItem.HasName("id") And ThisItem.Value("id") = jItem.Value("id") Then If NOT BackUpItem.HasName("id") And ThisItem.HasName("id") Then BackUpItem = ThisItem If ThisItem.Value("language") = "en" Then EnglishItem = ThisItem If ThisItem.Value("language") = Prefs.stringForKey("DBLanguage") Then LocalizedItem = ThisItem Exit End If End If Next IDs.Append BackUpItem.Value("id") 'b = False 'For n as Integer = 0 to Results.Count -1 'If BackUpItem <> Nil And BackUpItem.HasName("id") And BackUpItem.Value("id") = jItem.Value("id") Then 'b = True 'Exit 'End If 'Next 'If b Then Continue // Append result If LocalizedItem <> Nil And LocalizedItem.HasName("id") Then Results.Append LocalizedItem ElseIf EnglishItem <> Nil And EnglishItem.HasName("id") Then Results.Append EnglishItem ElseIf BackUpItem <> Nil And BackUpItem.HasName("id") Then Results.Append BackUpItem End If Next Else // No results found If JSONString.InStr( "Website is currently unreachable" ) > 0 Then MessageBox "TVDB is currently unreachable" Else MessageBox kNoShowsFoundTryAgain End If If NOT ManualSearch Then wndSearch.Show wndSearch.ccSearchBox.edtSearch.Text = ShowName.ReplaceAll(" - ", " ") End If Return End If Dim TotalResults as Integer = Results.Count If TotalResults > 1 Then Dim ID(), DBID(), Title(), ReleaseDate(), PosterURL(), FanartURL(), BannerURL() as String For i as Integer = 0 to Results.Count -1 Dim jItem as New JSONItem jItem = Results.Child(i) If jItem.HasName("IMDB_ID") Then ID.Append jItem.Value("IMDB_ID") Else ID.Append "" If jItem.HasName("id") Then DBID.Append jItem.Value("id") Else DBID.Append "" If jItem.HasName("SeriesName") Then Title.Append ReplaceAll( jItem.Value("SeriesName"), "&", "&" ) ElseIf jItem.HasName("AliasNames") And jItem.Value("AliasNames") <> "" Then Title.Append ReplaceAll( jItem.Value("AliasNames"), "&", "&" ) Else Title.Append "" End If If jItem.HasName("FirstAired") Then ReleaseDate.Append jItem.Value("FirstAired") Else ReleaseDate.Append "" PosterURL.Append "" FanartURL.Append "" If jItem.HasName("banner") Then BannerURL.Append GraphicsPath + jItem.Value("banner") else BannerURL.Append "" Next CommonCore.ShowSearchResults ID, DBID, Title, ReleaseDate, PosterURL, FanartURL, BannerURL ElseIf TotalResults = 1 And ManualSearch Then Dim jItem as New JSONItem jItem = Results.Child( 0 ) Dim ID, DBID, Title, ReleaseDate, PosterURL, FanartURL, BannerURL as String If jItem.HasName("IMDB_ID") Then ID = jItem.Value("IMDB_ID") If jItem.HasName("id") Then DBID = jItem.Value("id") If jItem.HasName("AliasNames") And jItem.Value("AliasNames") <> "" Then Title = jItem.Value("AliasNames") // Nice name ElseIf jItem.HasName("SeriesName") Then Title = jItem.Value("SeriesName") // Nice name Else Title = "" End If If jItem.HasName("FirstAired") Then ReleaseDate = jItem.Value("FirstAired") If jItem.HasName("banner") Then BannerURL = GraphicsPath + jItem.Value("banner") CommonCore.ShowSearchResult ID, DBID, Title, ReleaseDate, "", "", BannerURL ElseIf TotalResults = 1 Then ShowByID Results.Child(0).Value("id") ElseIf TotalResults = 0 Then Dim IMDbItem as new JSONItem IMDbItem = GetIMDbJSON( ShowName, True ) If IMDbItem <> Nil And IMDbItem.HasName("TITLE_ID") Then TotalResults = 1 If ManualSearch Then Dim FanartURL as String If IMDbItem.HasName("MEDIA_IMAGES") And IMDbItem.Child("MEDIA_IMAGES").Count > 0 Then FanartURL = IMDbItem.Child("MEDIA_IMAGES").Value(0) CommonCore.ShowSearchResult( IMDbItem.Value("TITLE_ID"), "", IMDbItem.Value("TITLE"), IMDbItem.Value("RELEASE_DATE"), IMDbItem.Value("POSTER"), FanartURL, "" ) Else ShowByID( IMDbItem.Value("TITLE_ID") ) End If End If End If dlgProgress.Close Return #If TargetLinux Then Dim Sckt as New TVDBSckt Dim JSONString as String dlgProgress.Add( Loc.kSearching + ":", ShowName ) JSONString = DefineEncoding( Sckt.Get( URL( "Search", ShowName.ReplaceAll( " - ", " " ) ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) Sckt.Close Dim jTVDB as New JSONItem jTVDB = JSONString.ConvertEncoding( Encodings.UTF8 ).XML2JSON Dim TotalResults as Integer = 0 If jTVDB <> Nil And jTVDB.HasName("Data") And _ jTVDB.ToString.InStr( 0, "Series" ) <> 0 And _ jTVDB.Child("Data").HasName("Series") And _ jTVDB.Child("Data").Child("Series").Count > 0 Then If jTVDB.Child("Data").Child("Series").IsArray Then Dim IDs() as String For i as Integer = 0 to jTVDB.Child("Data").Child("Series").Count - 1 Dim jItem as New JSONItem jItem = jTVDB.Child("Data").Child("Series").Child(i) If jItem.HasName("SeriesName") And jItem.Value("SeriesName").Instr( "* duplicate of" ) > 0 Then Continue Dim b as Boolean = False For n as Integer = 0 to IDs.Ubound If jItem.HasName("id") And jItem.Value("id") = IDs(n) Then b = True Exit End If Next If b Then Continue IDs.Append jItem.Value("id") TotalResults = TotalResults + 1 Next Dim s as String 'TotalResults = jTVDB.Child("Data").Child("Series").Count Else TotalResults = 1 End If Else If JSONString.InStr( "Website is currently unreachable" ) > 0 Then MessageBox "TVDB is currently unreachable" Else MessageBox kNoShowsFoundTryAgain End If If NOT ManualSearch Then wndSearch.Show wndSearch.ccSearchBox.edtSearch.Text = ShowName.ReplaceAll(" - ", " ") End If Return End If // If too many or too little results, try IMDB Search. If ( TotalResults <= 0 And ManualSearch ) Or TotalResults > 99 Then 'Dim jsonIMDb as String = IMDBjson( ShowName ) Dim IMDbItem as New JSONItem IMDbItem = GetIMDbJSON( ShowName, True ) 'If jsonIMDb.ValidJSON( "IMDb Search" ) Then IMDbItem.Load( jsonIMDb ) If IMDbItem.HasName("TITLE_ID") Then TotalResults = 1 If ManualSearch Then Dim FanartURL as String If IMDbItem.HasName("MEDIA_IMAGES") And IMDbItem.Child("MEDIA_IMAGES").Count > 0 Then FanartURL = IMDbItem.Child("MEDIA_IMAGES").Value(0) CommonCore.ShowSearchResult( IMDbItem.Value("TITLE_ID"), "", IMDbItem.Value("TITLE"), IMDbItem.Value("RELEASE_DATE"), IMDbItem.Value("POSTER"), FanartURL, "" ) dlgProgress.Close Return Else ShowByID IMDbItem.Value("TITLE_ID") End If End If Return End If If jTVDB.Child("Data").Child("Series").IsArray And TotalResults > 1 Then Dim ID(), DBID(), Title(), ReleaseDate(), PosterURL(), FanartURL(), BannerURL() as String For i as Integer = 0 to TotalResults - 1 Dim jItem as New JSONItem jItem = jTVDB.Child("Data").Child("Series").Child(i) // Detect duplicate entries Dim b as Boolean = False For n as Integer = 0 to ID.Ubound // Ignore duplicates entries with different IDs If jItem.HasName("SeriesName") And jItem.Value("SeriesName").Instr( "** duplicate of" ) > 0 Then b = True Exit End If // Ignore duplicate entires with same IDs If jItem.HasName("id") And jItem.Value("id") = DBID(n) Then If jItem.HasName("SeriesName") And Len( jItem.Value("SeriesName") ) > Len( Title(n) ) Then Title(n) = jItem.Value("SeriesName") b = True Exit End If Next If b Then Continue If jItem.HasName("IMDB_ID") Then ID.Append jItem.Value("IMDB_ID") Else ID.Append "" If jItem.HasName("id") Then DBID.Append jItem.Value("id") Else DBID.Append "" If jItem.HasName("SeriesName") Then Title.Append jItem.Value("SeriesName") Else Title.Append "" If jItem.HasName("FirstAired") Then ReleaseDate.Append jItem.Value("FirstAired") Else ReleaseDate.Append "" PosterURL.Append "" FanartURL.Append "" If jItem.HasName("banner") Then BannerURL.Append GraphicsPath + jItem.Value("banner") else BannerURL.Append "" Next CommonCore.ShowSearchResults ID, DBID, Title, ReleaseDate, PosterURL, FanartURL, BannerURL ElseIf TotalResults = 1 And ManualSearch Then Dim jItem as New JSONItem jItem = jTVDB.Child("Data").Child("Series") Dim ID, DBID, Title, ReleaseDate, PosterURL, FanartURL, BannerURL as String If jItem.HasName("IMDB_ID") Then ID = jItem.Value("IMDB_ID") If jItem.HasName("id") Then DBID = jItem.Value("id") If jItem.HasName("SeriesName") Then Title = jItem.Value("SeriesName") If jItem.HasName("FirstAired") Then ReleaseDate = jItem.Value("FirstAired") If jItem.HasName("banner") Then BannerURL = GraphicsPath + jItem.Value("banner") CommonCore.ShowSearchResult ID, DBID, Title, ReleaseDate, "", "", BannerURL ElseIf TotalResults = 1 Then Dim jItem as New JSONItem jItem = jTVDB.Child("Data").Child("Series") ShowByID jItem.Value("id") ElseIf TotalResults = 0 Then Dim IMDbItem as new JSONItem IMDbItem = GetIMDbJSON( ShowName, True ) If IMDbItem <> Nil And IMDbItem.HasName("TITLE_ID") Then TotalResults = 1 If ManualSearch Then Dim FanartURL as String If IMDbItem.HasName("MEDIA_IMAGES") And IMDbItem.Child("MEDIA_IMAGES").Count > 0 Then FanartURL = IMDbItem.Child("MEDIA_IMAGES").Value(0) CommonCore.ShowSearchResult( IMDbItem.Value("TITLE_ID"), "", IMDbItem.Value("TITLE"), IMDbItem.Value("RELEASE_DATE"), IMDbItem.Value("POSTER"), FanartURL, "" ) Else ShowByID( IMDbItem.Value("TITLE_ID") ) End If End If End If dlgProgress.Close Return #endif End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowStatus(ShowName as String, TVDBID as String = "") ShowStatusTVMaze( ShowName, TVDBID ) 'ShowStatusTVRage( ShowName ) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowStatusAll() Dim LstBox as Listbox = wndMain.lstTVShadow CommonCore.MassSearch = True ReDim CommonCore.UnFoundTitles(-1) ReDim CommonCore.UnfoundPaths(-1) For i as Integer = 0 to LstBox.ListCount - 1 If LstBox.Cell( i, 2 ) = "" Then Continue // Only update scraped shows. TVAttr.FolderParent = GetFolderItem( LstBox.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue // Only update if exists TVAttr.ClearProperties // Also gets done in NFORead, but just for sure. TVAttr.NFORead( TVAttr.FolderParent ) 'If TVAttr.Locked Then Continue Dim Title as String = TVAttr.Title 'Original 'Dim Year as Integer = TVAttr.DateYear Dim PreviousStatus as String = TVAttr.Status Dim PreviousAired as String = TVAttr.NextAired_Date' + " - " + TVAttr.NextAired_Episode If PreviousAired = "" Then PreviousAired = TVAttr.LastAired_Date dlgProgress.Add( Loc.kDownloading + ":", Title.ReplaceAll("&", "&&") + " " + Loc.kStatus.ReplaceAll(":","...").Lowercase ) // Do your thing! ShowStatus( Title, TVAttr.ID_TVDB ) 'If JSON = Nil Then 'If NOT Growl.Notify( Title + " " + Loc.kStatus.ReplaceAll(":",""), Loc.msg404TV ) Then '// NOT Growling? 'End If 'CommonCore.UnfoundTitles.Append Title + EndOfLine + "No TVRage ID found" 'CommonCore.UnfoundPaths.Append TVAttr.FolderParent 'End If If TVAttr.Status <> PreviousStatus Then If TVAttr.Status.InStr( 0, "Ended" ) > 0 OR TVAttr.Status = TVStatus_Ended Then CommonCore.UnfoundTitles.Append Title + " " + kStatusChangedCanceled ElseIf Trim( PreviousStatus ) = "" Then CommonCore.UnfoundTitles.Append Title + " " + kStatusHasChanged + " " + TVAttr.Status.Lowercase + "." Else CommonCore.UnfoundTitles.Append Title + " " + kStatusChangedFrom + " " + PreviousStatus.Lowercase + " " + Loc.kTo + " " + TVAttr.Status.Lowercase + "." End If CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If If PreviousAired = "" And TVAttr.NextAired_Date <> "" Then CommonCore.UnfoundTitles.Append Title + " " + kStatusChangedToAired + " " + CountHours( TVAttr.NextAired_Date, True ).Lowercase CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If 'If TVAttr.NextAired_Date + " - " + TVAttr.NextAired_Episode <> PreviousAired Then 'CommonCore.UnfoundTitles.Append "Airing information changed:" + EndOfLine + "[Prev] " + PreviousAired + EndOfLine + "[New] " + TVAttr.NextAired_Date + " - " + TVAttr.NextAired_Episode 'CommonCore.UnfoundPaths.Append TVAttr.FolderParent 'End If TVAttr.NFOWrite( TVAttr.FolderParent ) wndMain.lstTVShows.UpdateRow( i, Nil, True ) Next If CommonCore.UnfoundTitles.Ubound > -1 Then CommonCore.ShowUnfoundTitles( kStatusChanges ) ReDim CommonCore.UnfoundTitles(-1) ReDim CommonCore.UnfoundPaths(-1) CommonCore.MassSearch = False wndMain.lstSearch.CopyFrom( wndMain.lstTVShadow ) wndMain.lstTVShows.ResetFolderStatus End Sub #tag EndMethod #tag Method, Flags = &h21 Private Sub ShowStatusTVMaze(ShowName as String, TVDBID as String = "") If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Return App.ErrorMessage = "Just Starting" dim sckt as new TVMaze sckt.Yield = True dim content as string if TVDBID <> "" then content = trim( DefineEncoding( sckt.Get( URLCore.TVMaze( TVDBID, "LookUp" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) else content = trim( DefineEncoding( sckt.Get( URLCore.TVMaze( ShowName, "Search" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) end if // Redirected if sckt <> Nil and sckt.HTTPStatusCode = 301 and sckt.PageHeaders <> Nil then dim redirectURL as string = sckt.PageHeaders.Value( "Location" ) content = trim( DefineEncoding( sckt.Get( redirectURL, Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) end if dim ShowInfo as JSONItem if content <> "" and content.Left( 1 ) = "{" then ShowInfo = New JSONItem( content ) end if if ShowInfo <> Nil then // Reset previous TVAttr.NextAired_Date = "" TVAttr.NextAired_Episode = "" TVAttr.LastAired_Date = "" TVAttr.LastAired_Episode = "" // Show Status dim status as string = ShowInfo.Lookup( "status", "" ) Select case status case "Running" TVAttr.Status = TVStatus_ReturningSeries case "Ended" TVAttr.Status = TVStatus_Ended case "To Be Determined" TVAttr.Status = TVStatus_Bubble case "In Development" TVAttr.Status = TVStatus_Development else TVAttr.Status = "" End Select // Get Next/Previous episode URLs dim NextEpisodeURL as string dim PreviousEpisodeURL as String if ShowInfo.HasName( "_links" ) then dim links as JSONItem = ShowInfo.Value( "_links" ) if links <> Nil and links.HasName( "nextepisode" ) then dim nextep as JSONItem = links.Value( "nextepisode" ) if nextep <> Nil and nextep.HasName( "href" ) then NextEpisodeURL = nextep.Value( "href" ) end if end if if links <> Nil and links.HasName( "previousepisode" ) then dim prevep as JSONItem = links.Value( "previousepisode" ) if prevep <> Nil and prevep.HasName( "href" ) then PreviousEpisodeURL = prevep.Value( "href" ) end if end if end if // Get Next Episode information dim NextEpisodeInfo as JSONItem if NextEpisodeURL <> "" then dim NextEpInfo as string = trim( DefineEncoding( sckt.Get( NextEpisodeURL, Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) if NextEpInfo <> "" and NextEpInfo.Left(1) = "{" then NextEpisodeInfo = New JSONItem( NextEpInfo ) end if end if // Format next episode information if NextEpisodeInfo <> Nil and NextEpisodeInfo.Count > 0 then // Season/Episode - Name dim season as string = NextEpisodeInfo.Lookup( "season", "" ) if season.Len = 1 then season = "0" + season end if dim episode as string = NextEpisodeInfo.Lookup( "number", "" ) if episode.Len = 1 then episode = "0" + episode end if dim name as string = NextEpisodeInfo.Lookup( "name", "" ) if name <> "" then name = " - " + name end if TVAttr.NextAired_Episode = "S" + season + "E" + episode + name // Airdate // Because i did something silly with date formatting: dim NextAiredDate as new NativeSubclass.DateExtended dim date as string = NextEpisodeInfo.Lookup("airstamp","") if date <> "" then NextAiredDate.ISO8601 = date end if dim SillyDate as string = NextAiredDate.ISO8601.Replace(":00-", ":00G-").Replace(":00+", ":00G+").Replace(":00Z",":00G+") 'TVAttr.NextAired_Date = SillyDate 'dim date as string = NextEpisodeInfo.Lookup( "airdate", "" ) 'dim time as string = NextEpisodeInfo.Lookup( "airtime", "" ) 'dim combo as string = date + "T" + time + ":00" ' 'dim gmt as string = NextEpisodeInfo.Lookup( "airstamp", "" ) 'if gmt <> "" then 'gmt = gmt.ReplaceAll( combo, "" ) 'end if ' 'dim sillydate as string = date + "T" + time + "G" + gmt TVAttr.NextAired_Date = sillydate end if // Get Previous Episode information dim PreviousEpisodeInfo as JSONItem if PreviousEpisodeURL <> "" then dim PrevEpInfo as string = trim( DefineEncoding( sckt.Get( PreviousEpisodeURL, Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) if PrevEpInfo <> "" and PrevEpInfo.Left(1) = "{" then PreviousEpisodeInfo = New JSONItem( PrevEpInfo ) end if end if // Format previous episode information if PreviousEpisodeInfo <> Nil and PreviousEpisodeInfo.Count > 0 then // Season/Episode - Name dim season as string = PreviousEpisodeInfo.Lookup( "season", "" ) if season.Len = 1 then season = "0" + season end if dim episode as string = PreviousEpisodeInfo.Lookup( "number", "" ) if episode.Len = 1 then episode = "0" + episode end if dim name as string = PreviousEpisodeInfo.Lookup( "name", "" ) if name <> "" then name = " - " + name end if TVAttr.LastAired_Episode = "S" + season + "E" + episode + name // Airdate // Because i did something silly with date formatting: dim LastAiredDate as new NativeSubclass.DateExtended dim date as string = PreviousEpisodeInfo.Lookup("airstamp","") if date <> "" then LastAiredDate.ISO8601 = date end if dim SillyDate as string = LastAiredDate.ISO8601.Replace(":00-", ":00G-").Replace(":00+", ":00G+").Replace(":00Z",":00G+") TVAttr.LastAired_Date = SillyDate 'dim date as string = PreviousEpisodeInfo.Lookup( "airdate", "" ) 'dim time as string = PreviousEpisodeInfo.Lookup( "airtime", "" ) 'dim combo as string = date + "T" + time + ":00" ' 'dim gmt as string = PreviousEpisodeInfo.Lookup( "airstamp", "" ) 'if gmt <> "" then 'gmt = gmt.ReplaceAll( combo, "" ) 'end if ' 'TVAttr.LastAired_Date = date + "T" + time + "G" + gmt end if // Set folder label colors If Prefs.boolForKey("MatchFinderLabelsToTVStatus") Then Dim Clock as String = CountHours( TVAttr.NextAired_Date ) Dim Hours as Integer = Val( Clock ) If Clock <> "" Then App.ErrorMessage = "Clock <> """"" // Today & This week If Hours > -24 And Round( Hours / 24 ) <= 7 Then LabelIndexSet( TVAttr.FolderParent, 6 ) // Later then this week, but within a Month (30 days) If Round( Hours / 24 ) > 7 And Round( Hours / 24 ) <= 30 Then LabelIndexSet( TVAttr.FolderParent, 3 ) // Upcoming / Hiatus If Round( Hours / 24 ) > 30 Then LabelIndexSet( TVAttr.FolderParent, 1 ) Else App.ErrorMessage = "Clock = """"" // To be announced LabelIndexSet( TVAttr.FolderParent, 4 ) End If App.ErrorMessage = "Other Label Colors" If Status.InStr( 0, "In Development" ) > 0 Then LabelIndexSet( TVAttr.FolderParent, 5 ) // Future If Status.Contains( "Ended" ) OR Status.Contains("rejected") OR Status.Contains("Cancel") Then LabelIndexSet( TVAttr.FolderParent, 2 ) // Ended If TVAttr.Status = TVStatus_PilotRejected OR TVAttr.Status = TVStatus_Ended Then LabelIndexSet( TVAttr.FolderParent, 2 ) // Ended End If // @END MatchFinderLabelsToTVStatus end if End Sub #tag EndMethod #tag Method, Flags = &h21 Private Sub ShowStatusTVRage(Title as String) // TVRage Status': // 'In Development' / Future // 'Pilot Ordered' / Future // 'Pilot Rejected' / Ended? // 'Final Season' / Continuing // 'Returning Series' / Continuing // 'On Hiatus' / Hiatus // 'TBD/On The Bubble' / Hiatus // 'Canceled/Ended' / Ended // 'New Series' / Continuing 'Return // TVRAGE DOWN If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Return App.ErrorMessage = "Just Starting" Title = Title.ReplaceAll(":","").ReplaceAll(" & "," and ") Dim sckt as New TVDBSckt sckt.Yield = True // Get QuickInfo Dim QuickInfo as String = DefineEncoding( sckt.Get( URLCore.TVRage( String2Entities( Title ), "InfoQuick" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'dim TVRageTitle, SimplifiedTitle as String 'SimplifiedTitle = Trim( RegExThis( Title, "\([0-9][0-9][0-9][0-9]\)" ) ) 'TVRageTitle = QuickInfo.Mid( QuickInfo.InStr("Show Name@"), QuickInfo.InStr( EndOfLine ) ) ' 'if NOT QuickInfo.Contains( Title ) then 'QuickInfo = DefineEncoding( sckt.Get( URLCore.TVRage( String2Entities( Title ), "InfoQuick" ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) 'sckt.Close 'end if App.ErrorMessage = "QuickInfo 1" If QuickInfo.Left(7) = "No Show" Then App.ErrorMessage = "Growling/NotificationCenter" If NOT nc.Available Then If NOT Growl.Notify( "[TVRage] " + Title + " " + Loc.kStatus.ReplaceAll(":",""), Loc.kCouldNotBeFound.ReplaceAll("%s", Title) ) Then // NOT Growling? 'If DebugBuild Then MessageBox "TV Rage cannot find the show: " + Title End If Else nc.Message "[TVRage] " + Loc.kCouldNotBeFound.ReplaceAll("%s", Title) End If If CommonCore.MassSearch Then CommonCore.UnfoundTitles.Append Title + EndOfLine + "No TVRage show found" CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If Return End If App.ErrorMessage = "QuickInfo 2" If QuickInfo.InStr( 0, "Service currently unavailable due to maintenance" ) > 0 Then MessageBox "TVRage Service currently unavailable due to maintenance." Return End If App.ErrorMessage = "QuickInfo 3" If QuickInfo.MyMid( "Show ID@", EndOfLine.UNIX ) = "" Then // Try again App.ErrorMessage = "QuickInfo Try Again" QuickInfo = DefineEncoding( sckt.Get( URLCore.TVRage( String2Entities( Title ), "InfoQuick" ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) If QuickInfo.MyMid( "Show ID@", EndOfLine.UNIX ) = "" Then If NOT nc.Available Then If NOT Growl.Notify( "[TVRage] " + Title + " " + Loc.kStatus.ReplaceAll(":",""), Loc.kCouldNotBeFound.ReplaceAll("%s", Title) ) Then // NOT Growling? 'If DebugBuild Then MessageBox Loc.kCouldNotBeFound.ReplaceAll("%s", Title) End If Else nc.Message "[TVRage] " + Loc.kCouldNotBeFound.ReplaceAll("%s", Title) End If If CommonCore.MassSearch Then CommonCore.UnfoundTitles.Append Title + EndOfLine + kNoTVRageIDFound CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If 'If DebugBuild Then MessageBox "Quickinfo:" + EndOfLine + EndOfLine + QuickInfo Return End If End If TVAttr.ID_TVRage = QuickInfo.MyMid( "Show ID@", EndOfLine.UNIX ) // Get XML/JSON Dim JSONString as String Dim TVRage as New JSONItem If QuickInfo.InStr( 0, "RFC3339@" ) = 0 And QuickInfo.InStr( 0, "Show ID@" ) > 0 Then App.ErrorMessage = "JSON String Processing" JSONString = DefineEncoding( sckt.Get( URLCore.TVRage( TVAttr.ID_TVRage, "InfoFull" ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) 'JSONString = RegExThis( JSONString, ".*?", "" ) 'JSONString = RegExThis( JSONString, " country=""(.*?)""", "" ) 'JSONString = JSONString.XML2JSON 'If JSONString.ValidJSON("TVRage JSON") Then TVRage.Load JSONString TVRage = JSONString.XML2JSON If TVRage <> Nil And TVRage.HasName("Showinfo") And TVRage.Child("Showinfo").HasName("showid") Then TVRage = TVRage.Child("Showinfo") End If Dim EpisodeNr, EpisodeTitle, EpisodeAirDate as String App.ErrorMessage = "Next/last episode" // ## Latest/last episode Dim NextAiredInfo as String = QuickInfo.MyMid( "RFC3339@", EndOfLine.UNIX ) Dim Date as String = NextAiredInfo.NthField( "T", 1 ) Dim Time as String = NextAiredInfo.NthField( "T", 2 ).NthField( ":", 1 ) + ":" + NextAiredInfo.NthField( "T", 2 ).NthField( ":", 2 ) Dim GMT as String = NextAiredInfo.ReplaceAll( Date + "T" + Time, "" ).ReplaceAll( ":00", "" ) If QuickInfo.InStr( 0, "RFC3339@" ) = 0 Then GMT = Trim( QuickInfo.MyMid( "GMT", EndOfLine.UNIX ).ReplaceAll("NODST","").ReplaceAll("DST", "").ReplaceAll("@","") ) Time = Trim( match( ".* at (.*?) ", QuickInfo.MyMid( "Airtime@", EndOfLine.UNIX ), 1 ) ) If QuickInfo.MyMid( "Airtime@", EndOfLine.UNIX ).InStr( 0, "pm" ) > 0 Then Time = Str( Val( Time.NthField(":",1) ) + 12 ) + ":" + Time.NthField(":",2) End If End If If QuickInfo.InStr( 0, "GMT" ) = 0 Then GMT = "0" If TVRage <> Nil And TVRage.HasName("timezone") And TVRage.Value("timezone") <> "" Then GMT = Str( Val( TVRage.Value("timezone").ReplaceAll( "GMT", "" ).ReplaceAll( "DST", "" ) ) ) End If App.ErrorMessage = "Latest episode" // Latest episode Dim LatestEpisode() as String = Split( QuickInfo.MyMid( "Latest Episode@", EndOfLine.UNIX ), "^" ) If QuickInfo.InStr(0, "Latest Episode@") > 0 And LatestEpisode.Ubound > -1 Then TVAttr.LastAired_Episode = "S"+ LatestEpisode(0).ReplaceAll( "x", "E" ) + " - " + LatestEpisode(1) TVAttr.LastAired_Date = TVRageDate2Date( LatestEpisode(2) ) + "T" + Time + "G" + GMT 'If TVRage.HasName("airtime") And TVRage.Value("airtime") <> "" Then 'TVAttr.LastAired_Date = TVAttr.LastAired_Date + "T" + TVRage.Value("airtime") 'End If ' 'If TVRage.HasName("timezone") And TVRage.Value("timezone") <> "" Then 'TVAttr.LastAired_Date = TVAttr.LastAired_Date + "G" + TVRage.Value("timezone").ReplaceAll("GMT","").ReplaceAll("-DST","") 'End If Else TVAttr.LastAired_Date = "" TVAttr.LastAired_Episode = "" End If // Debug Dim LastAiredE as String = TVAttr.LastAired_Episode Dim LastAiredD as String = TVAttr.LastAired_Date App.ErrorMessage = "Next Episode" // ## Next episode Dim NextEpisode() as String = Split( QuickInfo.MyMid( "Next Episode@", EndOfLine.UNIX ), "^" ) If QuickInfo.InStr(0, "Next Episode@") > 0 And NextEpisode.Ubound > -1 Then TVAttr.NextAired_Episode = "S" + NextEpisode(0).ReplaceAll( "x", "E" ) + " - " + NextEpisode(1) TVAttr.NextAired_Date = TVRageDate2Date( NextEpisode(2) ) + "T" + Time + "G" + GMT 'If TVRage.HasName("airtime") And TVRage.Value("airtime") <> "" Then 'TVAttr.NextAired_Date = TVAttr.NextAired_Date + "T" + TVRage.Value("airtime") 'End If ' 'If TVRage.HasName("timezone") And TVRage.Value("timezone") <> "" Then 'TVAttr.NextAired_Date = TVAttr.NextAired_Date + "G" + TVRage.Value("timezone").ReplaceAll("GMT","").ReplaceAll("-DST","") 'End If Else TVAttr.NextAired_Date = "" TVAttr.NextAired_Episode = "" End If // ## Date Premiered 'If QuickInfo.InStr( 0, "Started@" ) > 0 Then TVAttr.DatePremiered = TVRageDate2Date( QuickInfo.MyMid( "Started@", EndOfLine.UNIX ) ) // ## Date Ended App.ErrorMessage = "Date Ended" If QuickInfo.InStr( 0, "Ended@" ) > 0 Then TVAttr.DateEnded = TVRageDate2Date( QuickInfo.MyMid( "Ended@", EndOfLine.UNIX ) ) // ## Status App.ErrorMessage = "Status" Dim Status as String If QuickInfo.InStr( 0, "Status@" ) > 0 Then Status = QuickInfo.MyMid( "Status@", EndOfLine.UNIX ) If Status = "" Then Status = "Hiatus" TVAttr.Status = Status Select Case Status Case "In Development" TVAttr.Status = TVStatus_Development Case "Pilot Ordered" TVAttr.Status = TVStatus_PilotOrdered Case "Final Season" TVAttr.Status = TVStatus_FinalSeason Case "Returning Series" TVAttr.Status = TVStatus_ReturningSeries Case "On Hiatus" TVAttr.Status = TVStatus_Hiatus Case "TBD/On The Bubble" TVAttr.Status = TVStatus_Bubble Case "Canceled/Ended" TVAttr.Status = TVStatus_Ended Case "New Series" TVAttr.Status = TVStatus_NewSeries Case "Pilot Rejected" TVAttr.Status = TVStatus_PilotRejected Case "Never Aired" //' TODO Else TVAttr.Status = Status End Select // ## Runtime App.ErrorMessage = "Runtime" If QuickInfo.InStr( 0, "Runtime@" ) > 0 Then TVAttr.DurationRuntime = Val( QuickInfo.MyMid( "Runtime@", EndOfLine.UNIX ) ) // ## Country App.ErrorMessage = "Country" If QuickInfo.InStr( 0, "Country@" ) > 0 Then TVAttr.Countries.Append QuickInfo.MyMid( "Country@", EndOfLine.UNIX ) // ## Classification App.ErrorMessage = "Classification" If QuickInfo.InStr( 0, "Classification@" ) > 0 Then TVAttr.Classification = QuickInfo.MyMid( "Classification@", EndOfLine.UNIX ) App.ErrorMessage = "Set folder label colors" // Set folder label colors If Prefs.boolForKey("MatchFinderLabelsToTVStatus") Then Dim Clock as String = CountHours( TVAttr.NextAired_Date ) Dim Hours as Integer = Val( Clock ) If Clock <> "" Then App.ErrorMessage = "Clock <> """"" // Today & This week If Hours > -24 And Round( Hours / 24 ) <= 7 Then LabelIndexSet( TVAttr.FolderParent, 6 ) // Later then this week, but within a Month (30 days) If Round( Hours / 24 ) > 7 And Round( Hours / 24 ) <= 30 Then LabelIndexSet( TVAttr.FolderParent, 3 ) // Upcoming / Hiatus If Round( Hours / 24 ) > 30 Then LabelIndexSet( TVAttr.FolderParent, 1 ) Else App.ErrorMessage = "Clock = """"" // To be announced LabelIndexSet( TVAttr.FolderParent, 4 ) End If App.ErrorMessage = "Other Label Colors" If Status.InStr( 0, "In Development" ) > 0 Then LabelIndexSet( TVAttr.FolderParent, 5 ) // Future If Status.Contains( "Ended" ) OR Status.Contains("rejected") OR Status.Contains("Cancel") Then LabelIndexSet( TVAttr.FolderParent, 2 ) // Ended If TVAttr.Status = TVStatus_PilotRejected OR TVAttr.Status = TVStatus_Ended Then LabelIndexSet( TVAttr.FolderParent, 2 ) // Ended End If App.ErrorMessage = "" Exception err as NilObjectException Dim w as New wndBugReporter w.Init( err, App.ErrorMessage ) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdate(ID as String) If TVAttr.Locked Then If NOT CommonCore.MassSearch Then MessageBox Loc.kIsLocked.ReplaceAll("%@", TVAttr.Title) Return End If Dim LstBox as Listbox = wndMain.lstTVShadow 'CommonCore.MassSearch = False If ID = "" Then MessageBox Loc.msgNoIDTV.ReplaceAll( "%S", TVAttr.FolderParent.Name ) Return End If // Reset current search. If NOT CommonCore.MassSearch Then wndMain.ccSearchBoxTVShows.edtSearch.Text = "" If wndMain.lstTVShows.SelCount > 1 Then CommonCore.MassSearch = True dlgProgress.Reset For i as Integer = 0 to wndMain.lstTVShows.ListCount -1 dlgProgress.Add( Loc.kDownloading +":", wndMain.lstTVShows.Cell( i, 0 ), 1, wndMain.lstTVShows.ListCount ) If NOT wndMain.lstTVShows.Selected(i) OR wndMain.lstTVShows.RowTag( i ) = "Folder" Then Continue If wndMain.lstTVShows.Cell( i, 1 ) <> "" Then TVAttr.FolderParent = GetFolderItem( wndMain.lstTVShows.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue If wndMain.lstTVShows.Cell( i, 2 ) = "" Then Continue TVAttr.NFORead( TVAttr.FolderParent ) If TVAttr.ID_TVDB <> "" Then ShowByID( TVAttr.ID_TVDB ) ElseIf TVAttr.ID_IMDb <> "" Then ShowByID( TVAttr.ID_IMDb ) Else Continue End If wndMain.lstTVShows.UpdateRow( i ) Next CommonCore.MassSearch = False Else If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", TVAttr.FolderParent.Name ) ShowByID ID, True End If If NOT CommonCore.MassSearch Then wndMain.lstTVShows.UpdateRow( LstBox.ListIndex ) wndMain.lstTVShows.Sort() TVAttr.LoadImages( TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload() End If Return End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdateAll() Dim LstBox as Listbox = wndMain.lstTVShadow CommonCore.MassSearch = True ReDim CommonCore.UnFoundTitles(-1) ReDim CommonCore.UnfoundPaths(-1) For i as Integer = 0 to LstBox.ListCount - 1 If LstBox.Cell( i, 2 ) = "" Then Continue // Only update scraped shows. TVAttr.FolderParent = GetFolderItem( LstBox.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue // Only update if exists TVAttr.ClearProperties // Also gets done in NFORead, but just for sure. TVAttr.NFORead( TVAttr.FolderParent ) If TVAttr.Locked Then Continue Dim Title as String = TVAttr.Title Dim ID as String = TVAttr.ID_TVDB If ID = "" Then ID = TVAttr.ID_IMDb dlgProgress.Add( Loc.kUpdating + ":", Title.ReplaceAll("&", "&&") + " " + Loc.mTabInfo.Lowercase + "..." ) ShowUpdate( ID ) TVAttr.NFOWrite( TVAttr.FolderParent ) wndMain.lstTVShows.UpdateRow( i, Nil, True ) Next If CommonCore.UnfoundTitles.Ubound > -1 Then CommonCore.ShowUnfoundTitles( "TV Show Status changes" ) CommonCore.MassSearch = False wndMain.lstSearch.CopyFrom( wndMain.lstTVShadow ) 'wndMain.lstTVShows.ResetFolderStatus wndMain.lstTVShows.Sort End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdateArt(ID as String) Dim Sckt as New TVDBSckt Dim LstBox as Listbox = wndMain.lstTVShadow // ## If item has not been scraped before, (No ID is available) then continue to the next item. If ID = "" Then Return App.ErrorMessage = "Get Title" Dim Title as String = TVAttr.Title 'LstBox.Cell( Lindex, 0 ) If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Title + " " + Loc.kImages.Lowercase + "..." ) If ID.Left(2) = "tt" Then ID = Sckt.IMDb2TVDB( ID ) // ## TVDB JSON App.ErrorMessage = "Download TVDB JSON" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB] " + Title + "..." ) Else dlgProgress.debug( Loc.kDownloading + " [TVDB] " + Title ) Dim JSONString as String = Sckt.Get( TVCore.URL( "Art", ID ), Prefs.integerForKey("TimeOut") ) Sckt.Close 'JSONString = JSONString.XML2JSON Dim TVDBArt as New JSONItem 'If JSONString.ValidJSON("TVDB Art") Then TVDBArt.Load( JSONString ) TVDBArt = JSONString.XML2JSON App.ErrorMessage = "Set TVDBArt JSON" If TVDBArt <> Nil And TVDBArt.HasName("Banners") And TVDBArt.ToString.InStr("""Banner""") > 0 And TVDBArt.Child("Banners").HasName("Banner") Then TVDBArt = TVDBArt.Child("Banners").Child("Banner") JSONString = "" // ## FanartTV App.ErrorMessage = "Download FanartTV JSON" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[FanartTV] " + Title + "..." ) Else dlgProgress.debug( Loc.kDownloading + " [FanartTV] " + Title ) JSONString = Trim( DefineEncoding( Sckt.Get( URLCore.FanartTV( ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) App.ErrorMessage = "Set FanartTV JSON" Dim FanartTVJSON as New JSONItem If JSONString.ValidJSON("Fanart.TV") Then FanartTVJSON.Load( JSONString ) JSONString = "" // ## And... ACTION! App.ErrorMessage = "Sckt.GetArt( TVDBArt, FanartTVJSON )" Sckt.GetArt( TVDBArt, FanartTVJSON ) // Write NFO App.ErrorMessage = "Write NFO" If NOT CommonCore.MassSearch Then TVAttr.NFOWrite( TVAttr.FolderParent ) wndMain.lstTVShows.UpdateRow TVAttr.LoadImages( TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload End If App.ErrorMessage = "" Exception err as NilObjectException Dim w as New wndBugReporter w.Init( err, "ShowUpdateArt( " + ID + " )" + Chr(13) + App.ErrorMessage ) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdateArtAll() Dim LstBox as Listbox = wndMain.lstTVShadow CommonCore.MassSearch = True For i as Integer = 0 to LstBox.ListCount -1 Dim ID as String = LstBox.Cell( i, 2 ) If ID = "" Then Continue TVAttr.FolderParent = GetFolderItem( LstBox.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue TVAttr.NFORead( TVAttr.FolderParent ) If TVAttr.Locked Then Continue dlgProgress.Add( Loc.kDownloading + ":", TVAttr.Title + " " + Loc.kImages.Lowercase + "..." ) If TVAttr.ID_TVDB <> "" Then ShowUpdateArt( TVAttr.ID_TVDB ) Else ShowUpdateArt( TVAttr.ID_IMDb ) End If TVAttr.NFOWrite( TVAttr.FolderParent ) wndMain.lstTVShows.UpdateRow( i, Nil, True ) Next If CommonCore.UnfoundTitles.Ubound > -1 Then CommonCore.ShowUnfoundTitles( "TV Art changes" ) CommonCore.MassSearch = False wndMain.lstSearch.CopyFrom( wndMain.lstTVShadow ) wndMain.lstTVShows.ResetFolderStatus End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdateRating(ID as String) If ID = "" Then Return Dim Sckt as New TVDBSckt Dim JSONString as String Dim IMDbID as String // :1 TVDB Alias If ID.Left(2) = "tt" Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kUpdating + ":", "[TVDB Alias] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) Else dlgProgress.Debug( "[TVDB Alias] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) End If IMDbID = ID JSONString = DefineEncoding( sckt.Get( TVCore.URL( "InfoAlias", ID ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) sckt.Close 'JSONString = JSONString.XML2JSON Dim TVDBAlias as New JSONItem 'If JSONString.ValidJSON("TVDB Alias") Then TVDBAlias.Load JSONString TVDBAlias = JSONString.XML2JSON If TVDBAlias.HasName("Data") And TVDBAlias.ToString.InStr( 0, "Series" ) > 0 And TVDBAlias.Child("Data").HasName("Series") And TVDBAlias.Child("Data").Child("Series").HasName("id") Then ID = TVDBAlias.Child("Data").Child("Series").Value("id") End If JSONString = "" End If // :2 TVDB Dim TVDB as New JSONItem If ID.Left(2) <> "tt" Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kUpdating + ":", "[TVDB] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) Else dlgProgress.Debug( "[TVDB] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) End If Dim XMLString as String = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) sckt.Close 'XMLString = DecodingFromHTMLMBS( XMLString ) 'JSONString = XMLString.XML2JSON 'If JSONString.ValidJSON("TVDB Local") Then TVDB.Load JSONString TVDB = XMLString.XML2JSON If TVDB.HasName("Data") And TVDB.ToString.InStr( 0, "Series" ) > 0 And TVDB.Child("Data").HasName("Series") Then TVDB = TVDB.Child("Data").Child("Series") XMLString = "" JSONString = "" End If // IMDb 'Dim IMDbID as String = ID If IMDbID.Left(2) <> "tt" Then If TVDB.HasName("IMDB_ID") And TVDB.Value("IMDB_ID") <> "" Then IMDbID = TVDB.Value("IMDB_ID") End If Dim IMDb as New JSONItem If IMDbID.Left(2) = "tt" Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kUpdating + ":", "[IMDb] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) Else dlgProgress.Debug( "[IMDb] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) End If IMDb = GetIMDbJSON( IMDbID, True ) 'JSONString = IMDBjson( IMDbID, True ) 'JSONString = JSONString 'If JSONString.ValidJSON("IMDb") Then IMDb.Load JSONString 'JSONString = "" End If // -- Process Data If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kProcessing + ":", TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) Else dlgProgress.Debug( Loc.kProcessing + " " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) End If // TVDB If TVDB.HasName("Rating") And TVDB.Value("Rating") <> "" Then TVAttr.Rating = TVDB.Value("Rating") If TVDB.HasName("RatingCount") And TVDB.Value("RatingCount") <> "" Then TVAttr.RatingVotes = TVDB.Value("RatingCount") If TVDB.HasName("ContentRating") And TVDB.Value("ContentRating") <> "" Then TVAttr.RatingMPAA = TVDB.Value("ContentRating") If TVDB.HasName("Network") And TVDB.Value("Network") <> "" Then TVAttr.TVNetwork = TVDB.Value("Network") // IMDB If IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then TVAttr.Rating = IMDb.Value("RATING") If IMDb.HasName("VOTES") And IMDb.Value("VOTES") <> "" Then TVAttr.RatingVotes = IMDb.Value("VOTES") If IMDb.HasName("MPAA_RATING") And IMDb.Value("MPAA_RATING") <> "" Then TVAttr.RatingMPAA = IMDb.Value("MPAA_RATING") If IMDb.HasName("RECOMMENDED_TITLES") And IMDb.Child("RECOMMENDED_TITLES").IsArray And IMDb.Child("RECOMMENDED_TITLES").Count > 0 Then ReDim TVAttr.RecShows(-1) ReDim TVAttr.RecShow_IDs(-1) For i as Integer = 0 to IMDb.Child("RECOMMENDED_TITLES").Count -1 Dim RecTitle as String = Trim( RegExThis( IMDb.Child("RECOMMENDED_TITLES").Value(i), "\[.*\]", "" ) ) Dim RecID as String = Trim( RegExThis( IMDb.Child("RECOMMENDED_TITLES").Value(i), ".*\[", "" ) ).ReplaceAll("]","") If RecTitle = "" Then RecTitle = Loc.kNotAvailable TVAttr.RecShows.Append RecTitle TVAttr.RecShow_IDs.Append RecID Next End If TVAttr.NFOWrite( TVAttr.FolderParent ) If NOT CommonCore.MassSearch Then wndMain.lstTVShows.UpdateRow TVAttr.LoadImages( TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload End If End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Function URL(sMethod as String, sProperty as String, Lang as String = "", SeasonNr as String = "", EpisodeNr as String = "") As String If Lang = "" Then Lang = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) If Lang = "gb" Then Lang = "en" Select Case sMethod case "Search" Return MirrorPath + "/api/GetSeries.php?seriesname=" + EncodingToURLMBS( sProperty ) + "&language=all" + "&alllang=1" case "InfoAlias" Return "http://thetvdb.com/api/GetSeriesByRemoteID.php?imdbid=" + sProperty' + "&language=" + Lang case "Info" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/all/" + Lang + ".xml" case "InfoShort" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/" + Lang + ".xml" case "EpisodeInfo" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/default/" + SeasonNr + "/" + EpisodeNr + "/ " + Lang + ".xml" case "Episode" Return MirrorPath + "/api/" + ApiKey + "/episodes/" + sProperty + "/" + Lang + ".xml" Case "Actors" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/actors.xml" Case "Art" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/banners.xml" case "EpisodeGuide" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/all/" + Lang + ".zip" End Select End Function #tag EndMethod #tag Constant, Name = ApiKey, Type = String, Dynamic = False, Default = \"47B3269189813ECF", Scope = Public #tag EndConstant #tag Constant, Name = GraphicsPath, Type = String, Dynamic = False, Default = \"http://thetvdb.com/banners/", Scope = Protected #tag EndConstant #tag Constant, Name = kNoShowsFoundTryAgain, Type = String, Dynamic = True, Default = \"No television series were found\x2C try again with fewer keywords or an alternative title.", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"No television series were found\x2C try again with fewer keywords or an alternative title." #Tag Instance, Platform = Any, Language = nl, Definition = \"Geen televisie series gevonden\x2C probeer opnieuw met minder sleutel woorden of een alternatieve titel." #Tag Instance, Platform = Any, Language = de, Definition = \"Keine Serie gefunden. Versuche es mit weniger Suchw\xC3\xB6rtern oder mit einem anderen Titel." #Tag Instance, Platform = Any, Language = sv, Definition = \"Ingen TV-serie hittades. F\xC3\xB6rs\xC3\xB6k igen med f\xC3\xA4rre nyckelord eller annan titel." #Tag Instance, Platform = Any, Language = fr, Definition = \"Aucune S\xC3\xA9rie TV trouv\xC3\xA9e\x2C veuillez modifier vos mots cl\xC3\xA9s ou essayer un titre alternatif." #tag EndConstant #tag Constant, Name = kNoTVRageIDFound, Type = String, Dynamic = True, Default = \"No TVRage ID found\x2C airing status has not been updated.", Scope = Public #Tag Instance, Platform = Any, Language = en, Definition = \"No TVRage ID found\x2C airing status has not been updated." #Tag Instance, Platform = Any, Language = nl, Definition = \"Geen TVRage ID gevonden\x2C uitzend status is niet veranderd." #Tag Instance, Platform = Any, Language = de, Definition = \"Kein TVRage ID gefunden hat\x2C Broadcast-Status nicht ge\xC3\xA4ndert." #tag EndConstant #tag Constant, Name = kStatusChangedCanceled, Type = String, Dynamic = True, Default = \"has been canceled.", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"has been canceled." #Tag Instance, Platform = Any, Language = nl, Definition = \"is geannuleerd." #Tag Instance, Platform = Any, Language = de, Definition = \"wurde abgesetzt." #Tag Instance, Platform = Any, Language = fr, Definition = \"a \xC3\xA9t\xC3\xA9 annul\xC3\xA9." #tag EndConstant #tag Constant, Name = kStatusChangedFrom, Type = String, Dynamic = True, Default = \"changed status from", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"changed status from" #Tag Instance, Platform = Any, Language = nl, Definition = \"veranderde status van" #Tag Instance, Platform = Any, Language = de, Definition = \"Status \xC3\xA4ndern von" #Tag Instance, Platform = Any, Language = fr, Definition = \"statut modifi\xC3\xA9 depuis" #tag EndConstant #tag Constant, Name = kStatusChangedToAired, Type = String, Dynamic = True, Default = \"has been announced to air in", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"has been announced to air in" #Tag Instance, Platform = Any, Language = nl, Definition = \"is aangekondigt om weer te beginnen in" #Tag Instance, Platform = Any, Language = de, Definition = \"Ausstrahlung angek\xC3\xBCndigt in" #Tag Instance, Platform = Any, Language = fr, Definition = \"a \xC3\xA9t\xC3\xA9 annonc\xC3\xA9 pour \xC3\xAAtre diffus\xC3\xA9 en" #tag EndConstant #tag Constant, Name = kStatusChanges, Type = String, Dynamic = True, Default = \"TV show status changes", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"TV show status changes" #Tag Instance, Platform = Any, Language = nl, Definition = \"Televisie series status veranderingen" #Tag Instance, Platform = Any, Language = de, Definition = \"Serien Status ge\xC3\xA4ndert" #Tag Instance, Platform = Any, Language = fr, Definition = \"Le statut de cette S\xC3\xA9rie TV change" #tag EndConstant #tag Constant, Name = kStatusHasChanged, Type = String, Dynamic = True, Default = \"has been changed to", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"has been changed to" #Tag Instance, Platform = Any, Language = nl, Definition = \"is gewijzigd naar" #Tag Instance, Platform = Any, Language = de, Definition = \"wurde ge\xC3\xA4ndert in" #Tag Instance, Platform = Any, Language = fr, Definition = \"a \xC3\xA9t\xC3\xA9 modifi\xC3\xA9 vers" #tag EndConstant #tag Constant, Name = MirrorPath, Type = String, Dynamic = False, Default = \"http://thetvdb.com", Scope = Public #tag EndConstant #tag Constant, Name = TVStatus_Bubble, Type = String, Dynamic = True, Default = \"TBD/On The Bubble", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"TBD/On The Bubble" #Tag Instance, Platform = Any, Language = nl, Definition = \"Onaangekondigd/Op het randje" #Tag Instance, Platform = Any, Language = de, Definition = \"TBD/On The Bubble" #Tag Instance, Platform = Any, Language = fr, Definition = \"TBD/On The Bubble" #tag EndConstant #tag Constant, Name = TVStatus_Development, Type = String, Dynamic = True, Default = \"In Development", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"In Development" #Tag Instance, Platform = Any, Language = nl, Definition = \"In ontwikkeling" #Tag Instance, Platform = Any, Language = de, Definition = \"In Entwicklung" #Tag Instance, Platform = Any, Language = sv, Definition = \"Under produktion" #Tag Instance, Platform = Any, Language = fr, Definition = \"En d\xC3\xA9veloppement" #tag EndConstant #tag Constant, Name = TVStatus_Ended, Type = String, Dynamic = True, Default = \"Canceled/Ended", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Canceled/Ended" #Tag Instance, Platform = Any, Language = nl, Definition = \"Geannuleerd/Be\xC3\xABindigd" #Tag Instance, Platform = Any, Language = de, Definition = \"Abgebrochen/Beendet" #Tag Instance, Platform = Any, Language = sv, Definition = \"Avslutad" #Tag Instance, Platform = Any, Language = fr, Definition = \"Annul\xC3\xA9/Termin\xC3\xA9" #tag EndConstant #tag Constant, Name = TVStatus_FinalSeason, Type = String, Dynamic = True, Default = \"Final Season", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Final Season" #Tag Instance, Platform = Any, Language = nl, Definition = \"Laatste seizoen" #Tag Instance, Platform = Any, Language = de, Definition = \"Letzte Staffel" #Tag Instance, Platform = Any, Language = sv, Definition = \"Sista s\xC3\xA4song" #Tag Instance, Platform = Any, Language = fr, Definition = \"Saison finale" #tag EndConstant #tag Constant, Name = TVStatus_Hiatus, Type = String, Dynamic = True, Default = \"On Hiatus", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"On Hiatus" #Tag Instance, Platform = Any, Language = nl, Definition = \"In hiatus" #Tag Instance, Platform = Any, Language = de, Definition = \"On Hiatus" #Tag Instance, Platform = Any, Language = fr, Definition = \"Interrompu" #tag EndConstant #tag Constant, Name = TVStatus_NewSeries, Type = String, Dynamic = True, Default = \"New Series", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"New Series" #Tag Instance, Platform = Any, Language = nl, Definition = \"Nieuwe Serie" #Tag Instance, Platform = Any, Language = de, Definition = \"Neue Serie" #Tag Instance, Platform = Any, Language = sv, Definition = \"Ny serie" #Tag Instance, Platform = Any, Language = fr, Definition = \"Nouvelles S\xC3\xA9ries" #tag EndConstant #tag Constant, Name = TVStatus_PilotOrdered, Type = String, Dynamic = True, Default = \"Pilot Ordered", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Pilot Ordered" #Tag Instance, Platform = Any, Language = nl, Definition = \"Piloot besteld" #Tag Instance, Platform = Any, Language = de, Definition = \"Pilot bestellt" #Tag Instance, Platform = Any, Language = fr, Definition = \"\"Pilote\" programm\xC3\xA9" #Tag Instance, Platform = Any, Language = sv, Definition = \"Pilot \xC3\xA4r best\xC3\xA4lld" #tag EndConstant #tag Constant, Name = TVStatus_PilotRejected, Type = String, Dynamic = True, Default = \"Pilot Rejected", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Pilot Rejected" #Tag Instance, Platform = Any, Language = nl, Definition = \"Piloot afgekeurd" #Tag Instance, Platform = Any, Language = fr, Definition = \"\"Pilote\" non programm\xC3\xA9" #tag EndConstant #tag Constant, Name = TVStatus_ReturningSeries, Type = String, Dynamic = True, Default = \"Returning Series", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Returning Series" #Tag Instance, Platform = Any, Language = nl, Definition = \"Terugkerende serie" #Tag Instance, Platform = Any, Language = de, Definition = \"Reaktivierte Serie" #Tag Instance, Platform = Any, Language = sv, Definition = \"\xC3\x85terkommande avsnitt" #Tag Instance, Platform = Any, Language = fr, Definition = \"S\xC3\xA9ries r\xC3\xA9currentes" #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Index" Visible=true Group="ID" InitialValue="-2147483648" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag EndViewBehavior End Module #tag EndModule \ No newline at end of file +#tag Module Protected Module TVCore #tag Method, Flags = &h0 Sub EpisodeUpdate(ID as String) If TVAttr.Locked Then MessageBox Loc.kIsLocked.ReplaceAll("%@", TVAttr.Title) Return End If Dim sckt as New TVDBSckt If ID.Left(2) = "tt" Then ID = sckt.IMDb2TVDB( ID ) End If Dim ShowName as String = TVAttr.Title If ShowName = "" Then ShowName = TVAttr.FolderParent.Name If ID = "" Then MessageBox loc.msgNoIDTV.ReplaceAll( "%S", ShowName ) Return End If Dim TVInfo as String = TVAttr.Title + " " + Loc.kEpisodes + "..." If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Info] " + TVInfo ) Else dlgProgress.debug( "[TVDB Info] " + TVInfo ) If ID.Left(2) <> "tt" Then Dim XMLString as String = DefineEncoding( sckt.Get( TVCore.URL( "Info", ID ), 60 ), Encodings.UTF8 ) 'XMLString = DecodingFromHTMLMBS( XMLString ) sckt.Close if XMLString.Contains("" then sckt.ProcessEpisodes XMLString else log "Invalid XML File for " + ID end if XMLString = "" End If If NOT CommonCore.MassSearch Then wndMain.lstTVShows.UpdateRow End Sub #tag EndMethod #tag Method, Flags = &h0 Sub GetThemeSong(Title as String, GetFirst as Boolean = True) If Trim( Title ) = "" Then Return Dim Sckt as New TVDBSckt // Normalize Title Title = Trim( RegExThis( Title, "\(.*?\)" ) ) Title = Title.ReplaceAll("'", "") If Title.Left(4) = "The " Then Title = Title.Replace( "The ","") If Title.Left(2) = "A " Then Title = Title.Replace( "A ", "" ) Title = Title.ReplaceAll( "&", " and " ) // Set starting positions Dim Page as Integer = 1 Dim URLs(), Rejects() as String Dim HTML as String = "Next" // Go through the pages. While HTML.InStr( 0, "Next" ) > 0 If DebugBuild Then dlgProgress.Debug( Loc.kProcessing + " TV Tunes page " + Str( Page ) ) HTML = sckt.Get( "http://www.televisiontunes.com/search.php?searWords=%22" + Title.ReplaceAll( " ", "+" ) + "%22&Send=Search&page=" + Str( Page ), Prefs.integerForKey("TimeOut") ) Sckt.Close HTML = HTML.MyMid( "
", "" ) '"" ) HTML = HTML.ReplaceAll("", "" ) Dim tmpURLs() as String = match_all( "", HTML ) For i as Integer = 0 to tmpURLs.Ubound If tmpURLs(i).InStr( 0, "search.php" ) > 0 Then Continue Dim Split() as String = tmpURLs(i).Split("/") Dim Name as String If Split.Ubound > 0 Then Name = Split( Split.Ubound ).ReplaceAll( "_", " " ) If Name.InStr( 0, " (The)" ) > 0 Then Name = "The " + Name.ReplaceAll( " (The)", "" ) Rejects.Append "http://www.televisiontunes.com/themesongs/" + Name.ReplaceAll(".html",".mp3").ReplaceAll(" ","%20") 'If Name.NthField( " - ", 1 ).InStr( 0, Title ) = 0 Then Continue // Don't pass Start, go directly to MP3. URLs.Append "http://www.televisiontunes.com/themesongs/" + Name.ReplaceAll(".html",".mp3").ReplaceAll(" ","%20") Next If HTML.InStr( 0, "Next" ) > 0 Then Page = Page + 1 Else Exit End If Wend 'URLs.SortWith 'If DebugBuild Then dlgProgress.Debug "" // Download first theme. If URLs.Ubound > -1 And GetFirst Then TVAttr.ThemeSongs = URLs Dim tmpTheme as FolderItem = SpecialFolder.Temporary.Child( App.Identifier ).Child("theme.mp3") If sckt.Get( URLs(0), tmpTheme, 800 ) Then If tmpTheme <> Nil And tmpTheme.Exists Then tmpTheme.MoveFileTo( TVAttr.FolderParent.Child("theme.mp3") ) Else 'MessageBox "Theme download failed!" End If Return ElseIf URLs.Ubound > -1 And NOT GetFirst Then wndItemChooser.Show If TVAttr.FolderParent.Child("theme.mp3").Exists Then wndItemChooser.lstResults.AddRow( "Local " + Loc.kThemeSong.Lowercase ) wndItemChooser.lstResults.RowTag( 0 ) = TVAttr.FolderParent.Child( "theme.mp3" ) End If For i as Integer = 0 to URLs.Ubound Dim Split() as String = URLs(i).Split("/") Dim Name as String = Trim( Split( Split.Ubound ).ReplaceAll(".mp3","").ReplaceAll("%20"," ") ) If Name.NthField( "-", 2 ) <> "" Then Name = Name.ReplaceAll( " - ", " / " ) Name = Name.ReplaceAll( "- ", " / " ) If Name.Left( Title.Len + 3 ) = Title + " / " Then Name = Name.Replace( Title + " / ", "" ) wndItemChooser.lstResults.AddRow( Trim( Name ) ) Else wndItemChooser.lstResults.AddRow( Trim( Name ) ) End If wndItemChooser.lstResults.RowTag( wndItemChooser.lstResults.ListCount -1 ) = URLs(i) Next If wndItemChooser.lstResults.ListCount > 0 Then wndItemChooser.lstResults.ListIndex = 0 ElseIf NOT GetFirst Then MessageBox Loc.kCouldNotBeFound.ReplaceAll( "%S", Loc.kThemeSongs ) End If End Sub #tag EndMethod #tag Method, Flags = &h0 Sub MissingShows() Dim sckt as New TVDBSckt sckt.Yield = True CommonCore.MassSearch = True ReDim CommonCore.UnFoundTitles(-1) ReDim CommonCore.UnfoundPaths(-1) Dim LstBox as Listbox = wndMain.lstTVShadow For i as Integer = 0 to LstBox.ListCount - 1 // If scraped before, skip it! If LstBox.Cell( i, 2 ) <> "" Then Continue // If TVAttr.FolderParent does not exist, Skip it! TVAttr.FolderParent = GetFolderItem( LstBox.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue Dim ShowTitle as String = TVAttr.FolderParent.Name // Search for show dlgProgress.Add( Loc.kSearching + ":", ShowTitle + "..." ) Dim XMLString as String = DefineEncoding( Sckt.Get( URL( "Search", ShowTitle.ReplaceAll( " - ", " " ) ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) Sckt.Close Dim SearchResults as New JSONItem SearchResults = XMLString.XML2JSON 'JSONString = JSONString.XML2JSON.ToString // If Invalid JSON, Skip it! If SearchResults = Nil Then 'NOT JSONString.ValidJSON( "TVDB" ) Then If NOT nc.Available Then If NOT Growl.Notify( Loc.FetchAllMetadata + ":", Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) ) Then // NOT Growling! End If Else nc.Message Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) End If CommonCore.UnFoundTitles.Append ShowTitle + chr(13) + "Invalid JSON returned from Server."' + chr(13) + TVAttr.FolderParent.ShellPath.ReplaceAll("\","") + JSONString CommonCore.UnfoundPaths.Append TVAttr.FolderParent Continue End If // Get ID if available. Dim ID as String 'SearchResults.Load( JSONString ) Dim MultipleResults as Boolean If SearchResults <> Nil And SearchResults.HasName("Data") And SearchResults.ToString.InStr( 0, "Series" ) > 0 And SearchResults.Child("Data").HasName("Series") Then If SearchResults.Child("Data").Child("Series").IsArray And SearchResults.Child("Data").Child("Series").Count >= 1 Then // Should I allow scrape if there's more then one result? TVDB is a bit unreliable. Dim IDs() as String For n as Integer = 0 to SearchResults.Child("Data").Child("Series").Count -1 Dim CurrentID as String = SearchResults.Child("Data").Child("Series").Child(n).Value("seriesid") If IDs = Nil OR IDs.Ubound < 0 Then IDs.Append CurrentID Else Dim b as Boolean = False For t as Integer = 0 to IDs.Ubound If IDs(t) = CurrentID Then b = True Exit End If Next If NOT b Then IDs.Append CurrentID End If Next MultipleResults = ( IDs.Ubound >= 1 ) If SearchResults.Child("Data").Child("Series").Child(0).HasName("seriesid") Then ID = SearchResults.Child("Data").Child("Series").Child(0).Value("seriesid") Else If SearchResults.Child("Data").Child("Series").HasName("seriesid") Then ID = SearchResults.Child("Data").Child("Series").Value("seriesid") End If End If // If there's no ID available, Skip it! If ID = "" Then If Not nc.Available Then If NOT Growl.Notify( Loc.FetchAllMetadata + ":", Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) ) Then End If Else nc.Message Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) End If CommonCore.UnfoundTitles.Append Loc.kCouldNotBeFound.ReplaceAll( "%s", ShowTitle ) CommonCore.UnfoundPaths.Append TVAttr.FolderParent Continue End If If NOT MultipleResults Then ShowByID( ID ) If Prefs.boolForKey("AutoManageMedia") Then SingleRenamer TVAttr.FolderParent, i, True Else wndMain.lstTVShows.UpdateRow i, Nil, True End If If MultipleResults And SearchResults <> Nil And SearchResults.HasName("Data") And SearchResults.Child("Data").HasName("Series") And SearchResults.Child("Data").Child("Series").IsArray Then 'And SearchResults <> Nil And SearchResults.Child("Data").Child("Series").HasName("SeriesName") Then Dim jItem as New JSONItem jItem = SearchResults.Child("Data").Child("Series").Child(0) If jItem.HasName("SeriesName") Then If jItem.HasName("FirstAired") Then CommonCore.UnfoundTitles.Append TVAttr.FolderParent.Name + chr(13) + Loc.kMultipleResultsFoundTV Else CommonCore.UnfoundTitles.Append TVAttr.FolderParent.Name + chr(13) + Loc.kMultipleResultsFoundTV End If End If CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If Next CommonCore.MassSearch = False wndMain.lstTVShows.SortList wndMain.lstTVShows.ResetFolderStatus MessageBox Loc.kDownloadComplete CommonCore.ShowUnfoundTitles( Loc.kCouldNotBeFoundFollowing.ReplaceAll( "%S", Loc.TVShows.Lowercase ) ) Return End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowArt(ID as String, Mode as String, Season as Integer = - 1) If ID = "" Then Return Dim SeasonStr as String = "All" If Season > -1 Then SeasonStr = Str( Season ) End If Dim Sckt as New TVDBSckt Dim JSONString as String Dim bTVDB as Boolean = False bTVDB = ( Mode = "Banners" OR Mode = "Posters" OR Mode = "Backdrops" OR Mode = "SeasonPoster" OR Mode = "SeasonBanner" ) Dim bFanartTV as Boolean = False bFanartTV = ( Mode = "Banners" OR Mode = "Posters" OR Mode = "Backdrops" OR Mode = "ClearArt" OR Mode = "Logos" OR Mode = "CharacterArt" OR Mode = "Thumbs" OR Mode = "SeasonThumb" OR Mode = "SeasonFanart" ) // ## TVDB Alias dlgProgress.Add( Loc.kDownloading + ":", Loc.kImages + " " + Loc.mTabInfo + "..." ) If bTVDB And ID.Left(2) = "tt" Then ID = Sckt.IMDb2TVDB( ID ) Dim Type as String // User friendly type // ## TVDBArt Dim TVDBArt as New JSONItem If bTVDB And ID.Left(2) <> "tt" Then dlgProgress.Add( Loc.kDownloading + ":", "TVDB" + " " + Loc.kImages + " " + Loc.mTabInfo + "..." ) JSONString = DefineEncoding( Sckt.Get( TVCore.URL( "Art", ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) Sckt.Close TVDBArt = JSONString.XML2JSON If TVDBArt.HasName("Banners") And TVDBArt.ToString.InStr("""Banner""") > 0 And TVDBArt.Child("Banners").HasName("Banner") Then TVDBArt = TVDBArt.Child("Banners").Child("Banner") End If JSONString = "" End If // ## FanartTV Dim FanartTV as New JSONItem If bFanartTV Then dlgProgress.Add( Loc.kDownloading + ":", "Fanart.TV" + " " + Loc.kImages + " " + Loc.mTabInfo + "..." ) JSONString = Trim( DefineEncoding( Sckt.Get( URLCore.FanartTV( ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) Sckt.Close 'Dim FirstBracketLoc as Integer' = JSONString.InStr(2, "{" ) 'JSONString = Trim( JSONString.Right( JSONString.Len - FirstBracketLoc + 1) ) If JSONString.ValidJSON("Fanart.TV") Then FanartTV.Load JSONString JSONString = "" End If Dim IMGArray() as Picture, Dimensions(), URLs(), ThumbURLs() as String Dim jItem as New JSONItem // Get URLs and dimensions If TVDBArt <> Nil And NOT TVDBArt.IsArray Then Dim jt as New JSONItem jt.Append( TVDBArt ) TVDBArt = jt End If // TVDB If TVDBArt <> Nil And TVDBArt.IsArray Then For i as Integer = 0 to TVDBArt.Count -1 jItem = TVDBArt.Child(i) If NOT jItem.HasName("BannerPath") OR jItem.Value("BannerPath") = "" Then Continue If ( jItem.Value( "BannerType" ) = "poster" And Mode = "Posters" ) OR _ jItem.Value( "BannerType" ) = "fanart" And Mode = "Backdrops" OR _ '( Mode = "TV-Backdrops" OR Mode = "SeasonFanart" ) OR _ ( jItem.Value( "BannerType" ) = "series" And Mode = "Banners" ) OR _ ( jItem.Value( "BannerType" ) = "season" And jItem.Value("BannerType2") = "season" And Mode = "SeasonPoster" ) OR _ ( jItem.Value( "BannerType" ) = "season" and jItem.Value("BannerType2") = "seasonwide" And Mode = "SeasonBanner" ) _ Then Dim Cache as String = "" If Mode.InStr( 0, "backdrop" ) > 0 OR Mode.InStr( 0, "poster" ) > 0 Then Cache = "_cache/" If Mode.InStr( 0, "Season" ) > 0 Then 'And Mode.InStr( 0, "SeasonFanart" ) = 0 Then If jItem.HasName("Season") And jItem.Value("Season") = SeasonStr Then ThumbURLs.Append TVCore.GraphicsPath + Cache + jItem.Value("BannerPath") Dimensions.Append jItem.Value("BannerType2") URLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") End If Else ThumbURLs.Append TVCore.GraphicsPath + Cache + jItem.Value("BannerPath") Dimensions.Append jItem.Value("BannerType2") URLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") End If End If Next End If Dim SeasonName as String jItem = Nil Select Case Mode Case "Posters" Type = Loc.kPoster if FanartTV <> Nil and FanartTV.HasName("tvposter") then jItem = FanartTV.Child("tvposter") for i as Integer = 0 to jItem.Count -1 if jItem.Child(i).Lookup("url", "" ) <> "" then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "1000x1426" ThumbURLs.Append Replace( jItem.Child(i).Value("url"), "/fanart/", "/preview/" ) end if next end if // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("poster.jpg").Exists Then TVAttr.ART_Poster = URL2Picture( URLs(0), TVAttr.FolderParent, "poster.jpg" ) 'URL2Picture( URLs(0), "poster", "jpg", TVAttr.FolderParent ) CacheImageSet( TVAttr.ART_Poster, TVAttr.ID_IMDb + ".television.poster.jpg" ) wndMain.cvsTVShowDetails.Reload Return End If Case "Backdrops" Type = Loc.kFanart // fanarttv if FanartTV <> Nil and FanartTV.HasName("showbackground") Then jItem = FanartTV.Child("showbackground") for i as Integer = 0 to jItem.Count -1 if jItem.Child(i).Lookup("url", "") <> "" then urls.Append jItem.Child(i).Value("url") Dimensions.Append "1920x1080" ThumbURLs.Append Replace( jItem.Child(i).Value("url"), "/fanart/", "/preview/" ) end if // @END if jItem.Child(i).Value("url") <> "" next // @END each jItem.Child end if // @END FanartTV <> Nil // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("fanart.jpg").Exists Then TVAttr.ART_Fanart = URL2Picture( URLs(0), TVAttr.FolderParent, "fanart.jpg" ) 'URL2Picture( URLs(0), "fanart", "jpg", TVAttr.FolderParent ) CacheImageSet( TVAttr.ART_Fanart, TVAttr.ID_IMDb + ".television.fanart.jpg" ) wndMain.cvsTVShowDetails.Reload Return End If Case "Banners" Type = Loc.kBanner If FanartTV <> Nil ANd FanartTV.HasName("tvbanner") Then jItem = FanartTV.Child("tvbanner") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "1000x185" ThumbURLs.Append jItem.Child(i).Value("url") 'ThumbURLs.Append Replace( jItem.Child(i).Value("url"), "/fanart/", "/preview/" ) End If Next End If // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("banner.jpg").Exists Then TVAttr.ART_Banner = URL2Picture( URLs(0), TVAttr.FolderParent, "banner.jpg" ) 'URL2Picture( URLs(0), "banner", "jpg", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "Logos" Type = Loc.kLogo // HDTV Logo URLs If FanartTV <> Nil ANd FanartTV.HasName("hdtvlogo") Then jItem = FanartTV.Child("hdtvlogo") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "800x310" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // Logo URLs If FanartTV <> Nil ANd FanartTV.HasName("clearlogo") Then jItem = FanartTV.Child("clearlogo") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "400x155" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("logo.png").Exists Then TVAttr.ART_Logo = URL2Picture( URLs(0), TVAttr.FolderParent, "logo.png" ) 'URL2Picture( URLs(0), "logo", "png", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "ClearArt" Type = Loc.kClearArt // HD ClearArt URLs If FanartTV <> Nil ANd FanartTV.HasName("hdclearart") Then jItem = FanartTV.Child("hdclearart") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "1000x562" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // ClearArt URLs If FanartTV <> Nil ANd FanartTV.HasName("clearart") Then jItem = FanartTV.Child("clearart") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "500x281" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("clearart.png").Exists Then TVAttr.ART_ClearArt = URL2Picture( URLs(0), TVAttr.FolderParent, "clearart.png" ) 'URL2Picture( URLs(0), "clearart", "png", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "CharacterArt" Type = Loc.kCharacterArt // CharacterArt URLs If FanartTV <> Nil ANd FanartTV.HasName("characterart") Then jItem = FanartTV.Child("characterart") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "512x512" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If // If only one is available, and no locals exist. If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("character.png").Exists Then TVAttr.ART_ClearArt = URL2Picture( URLs(0), TVAttr.FolderParent, "character.png" ) 'URL2Picture( URLs(0), "character", "png", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "Thumbs" Type = Loc.kTVThumb // CharacterArt URLs If FanartTV <> Nil ANd FanartTV.HasName("tvthumb") Then jItem = FanartTV.Child("tvthumb") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "500x281" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If If URLs.Ubound = 0 And NOT TVAttr.FolderParent.Child("landscape.jpg").Exists Then TVAttr.ART_TVThumb = URL2Picture( URLs(0), TVAttr.FolderParent, "landscape.jpg" ) 'URL2Picture( URLs(0), "landscape", "jpg", TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload Return End If Case "SeasonPoster" Type = Loc.kSeason + " " + Loc.kPoster SeasonName = "season%S-poster.jpg" If Season = 0 Then SeasonName = "season-specials-poster.jpg" If Season < 0 Then SeasonName = "season-all-posters.jpg" Case "SeasonBanner" Type = Loc.kSeason + " " + Loc.kBanner SeasonName = "season%S-banner.jpg" If Season = 0 Then SeasonName = "season-specials-banner.jpg" If Season < 0 Then SeasonName = "season-all-banner.jpg" Case "SeasonThumb" Type = Loc.kSeason + " " + Loc.kTVThumb SeasonName = "season%S-landscape.jpg" If Season = 0 Then SeasonName = "season-specials-landscape.jpg" If Season < 0 Then SeasonName = "season-all-landscape.jpg" // SeasonThumb URLs If FanartTV <> Nil ANd FanartTV.HasName("seasonthumb") Then jItem = FanartTV.Child("seasonthumb") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" And jItem.Child(i).Value("season") = SeasonStr Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "500x281" ThumbURLs.Append jItem.Child(i).Value("url")' + "/preview" End If Next End If Case "SeasonFanart" Type = Loc.kSeason + " " + Loc.kFanart SeasonName = "season%S-fanart.jpg" If Season = 0 Then SeasonName = "season-specials-fanart.jpg" If Season < 0 Then SeasonName = "season-all-fanart.jpg" // Season Fanart URLs If FanartTV <> Nil And FanartTV.HasName("showbackground") Then jItem = FanartTV.Child("showbackground") For i as Integer = 0 to jItem.Count -1 If jItem.Child(i).Value("url") <> "" And jItem.Child(i).Value("season") = SeasonStr Then URLs.Append jItem.Child(i).Value("url") Dimensions.Append "1920x1080" ThumbURLs.Append jItem.Child(i).Value("url") + "/preview" End If Next End If End Select // Season Location If URLs.Ubound = 0 And Mode.InStr( 0, "Season" ) > 0 Then 'If Season = -1 Then Season = 1 Dim DisplaySeason as String = Str( Season ) If DisplaySeason.Len = 1 Then DisplaySeason = "0" + DisplaySeason Dim Parent as FolderItem = TVAttr.FolderParent 'If Season = 0 And Parent.Child( "Specials" ).Exists Then 'Parent = Parent.Child("Specials") 'ElseIf Season > 0 And Parent.Child( "Season " + DisplaySeason ).Exists Then 'Parent = Parent.Child( "Season " + DisplaySeason ) 'ElseIf Season = -1 And Parent.Child( TVAttr.Title ).Exists Then 'Parent = Parent.Child( TVAttr.Title ) 'End If If NOT Parent.Child( SeasonName.ReplaceAll("%S", DisplaySeason ) ).Exists Then URL2Picture( URLs(0), Parent, SeasonName.ReplaceAll( "%S", DisplaySeason ) ) Return End If End If // Download image thumbs. dlgProgress.Reset For i as Integer = 0 to ThumbURLs.Ubound dlgProgress.Add( Loc.kDownloading + ":", Str( i + 1 ) + Loc.k1of2 + Str( ThumbURLs.Ubound + 1 ) + " " + Type + " " + Loc.kImages + "...", 1, ThumbURLs.Ubound + 1) 'IMGArray.Append Picture.FromData( Sckt.Get( ThumbURLs(i), Prefs.integerForKey("TimeOut") ) ) IMGArray.Append Picture.FromData( CURLGet( ThumbURLs(i) ) ) Sckt.Close If IMGArray(i) <> Nil And val( Dimensions(i).ReplaceAll("x","") ) <= 0 Then Dimensions(i) = Str( IMGArray(i).Width ) + "x" + Str( IMGArray(i).Height ) Next If IMGArray = Nil Or IMGArray.Ubound <= -1 Then MessageBox MovieCore.kNoImagesFound.ReplaceAll( "%S", Type ) wndMain.cvsTVShowDetails.Reload Return End If wndPreviewThumbs.Init IMGArray, Dimensions, URLs, Mode, Season End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowByID(ID as String, Update as Boolean = False) If TVAttr.Locked Then MessageBox Loc.kIsLocked.ReplaceAll("%@", TVAttr.Title) Return End If Dim sckt as New TVDBSckt sckt.Yield = True Dim ShowName as String = TVAttr.FolderParent.Name If ID = "" Then MessageBox loc.msgNoIDTV.ReplaceAll( "%S", ShowName ) Return End If // Reset current search. If NOT CommonCore.MassSearch Then wndMain.ccSearchBoxTVShows.edtSearch.Text = "" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kSearching + ":", ShowName, 1, 5 ) // 1 'MessageBox ID sckt.getShowNFO( ID, Update ) If NOT CommonCore.MassSearch Then wndMain.lstTVShows.UpdateRow TVAttr.NFORead( TVAttr.FolderParent ) TVAttr.LoadImages( TVAttr.FolderParent ) 'wndMain.lstTVShows.SortList() wndMain.cvsTVShowDetails.Reload() End If Return End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowSearch(ShowName as String, ManualSearch as Boolean = False) Dim sckt as New TVDBSckt Dim JSONString as String dlgProgress.Add( Loc.kSearching + ":", ShowName ) JSONString = DefineEncoding( sckt.Get( URL( "Search", ShowName.ReplaceAll( " - ", " " ) ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close Dim jTVDB as New JSONItem jTVDB = JSONString.ConvertEncoding( Encodings.UTF8 ).XML2JSON Dim Results as New JSONItem If jTVDB <> Nil ANd jTVDB.HasName("Data") And jTVDB.ToString.InStr( "Series" ) > 0 And jTVDB.Child("Data").HasName("Series") And jTVDB.Child("Data").Child("Series").Count > 0 Then Dim IDs() as String Dim TVShows() as JSONItem If jTVDB.Child("Data").Child("Series").IsArray Then For i as Integer = 0 to jTVDB.Child("Data").Child("Series").Count -1 TVShows.Append jTVDB.Child("Data").Child("Series").Child(i) Next Else TVShows.Append jTVDB.Child("Data").Child("Series") End If For each jItem as JSONItem in TVShows 'If jItem.HasName("language") And jItem.Value("language") <> Prefs.stringForKey("DBLanguage") Then Continue 'For i as Integer = 0 to jTVDB.Child("Data").Child("Series").Count -1 'Dim jItem as New JSONItem 'If jTVDB.Child("Data").Child("Series").IsArray Then 'jItem = jTVDB.Child("Data").Child("Series").Child(i) 'Else 'jItem = jItem.Child("Data").Child("Series") 'End If // Skip duplicates with different IDs If jItem.HasName("SeriesName") And jItem.Value("SeriesName").InStr( "* duplicate of" ) > 0 Then Continue // Skip Duplicats with same IDs Dim b as Boolean = False For n as Integer = 0 to IDs.Ubound If jItem.HasName("id") and jItem.Value("id") = IDs(n) Then b = True Exit End If Next If b Then Continue // Find duplicate entries in my language. Dim EnglishItem as New JSONItem Dim LocalizedItem as New JSONItem Dim BackUpItem as New JSONItem For n as Integer = 0 to TVShows.Ubound 'jTVDB.Child("Data").Child("Series").Count -1 Dim ThisItem as New JSONItem ThisItem = TVShows(n) 'jTVDB.Child("Data").Child("Series").Child(n) If ThisItem.HasName("id") And ThisItem.Value("id") = jItem.Value("id") Then If NOT BackUpItem.HasName("id") And ThisItem.HasName("id") Then BackUpItem = ThisItem If ThisItem.Value("language") = "en" Then EnglishItem = ThisItem If ThisItem.Value("language") = Prefs.stringForKey("DBLanguage") Then LocalizedItem = ThisItem Exit End If End If Next IDs.Append BackUpItem.Value("id") 'b = False 'For n as Integer = 0 to Results.Count -1 'If BackUpItem <> Nil And BackUpItem.HasName("id") And BackUpItem.Value("id") = jItem.Value("id") Then 'b = True 'Exit 'End If 'Next 'If b Then Continue // Append result If LocalizedItem <> Nil And LocalizedItem.HasName("id") Then Results.Append LocalizedItem ElseIf EnglishItem <> Nil And EnglishItem.HasName("id") Then Results.Append EnglishItem ElseIf BackUpItem <> Nil And BackUpItem.HasName("id") Then Results.Append BackUpItem End If Next Else // No results found If JSONString.InStr( "Website is currently unreachable" ) > 0 Then MessageBox "TVDB is currently unreachable" Else MessageBox kNoShowsFoundTryAgain End If If NOT ManualSearch Then wndSearch.Show wndSearch.ccSearchBox.edtSearch.Text = ShowName.ReplaceAll(" - ", " ") End If Return End If Dim TotalResults as Integer = Results.Count If TotalResults > 1 Then Dim ID(), DBID(), Title(), ReleaseDate(), PosterURL(), FanartURL(), BannerURL() as String For i as Integer = 0 to Results.Count -1 Dim jItem as New JSONItem jItem = Results.Child(i) If jItem.HasName("IMDB_ID") Then ID.Append jItem.Value("IMDB_ID") Else ID.Append "" If jItem.HasName("id") Then DBID.Append jItem.Value("id") Else DBID.Append "" If jItem.HasName("SeriesName") Then Title.Append ReplaceAll( jItem.Value("SeriesName"), "&", "&" ) ElseIf jItem.HasName("AliasNames") And jItem.Value("AliasNames") <> "" Then Title.Append ReplaceAll( jItem.Value("AliasNames"), "&", "&" ) Else Title.Append "" End If If jItem.HasName("FirstAired") Then ReleaseDate.Append jItem.Value("FirstAired") Else ReleaseDate.Append "" PosterURL.Append "" FanartURL.Append "" If jItem.HasName("banner") Then BannerURL.Append GraphicsPath + jItem.Value("banner") else BannerURL.Append "" Next CommonCore.ShowSearchResults ID, DBID, Title, ReleaseDate, PosterURL, FanartURL, BannerURL ElseIf TotalResults = 1 And ManualSearch Then Dim jItem as New JSONItem jItem = Results.Child( 0 ) Dim ID, DBID, Title, ReleaseDate, PosterURL, FanartURL, BannerURL as String If jItem.HasName("IMDB_ID") Then ID = jItem.Value("IMDB_ID") If jItem.HasName("id") Then DBID = jItem.Value("id") If jItem.HasName("AliasNames") And jItem.Value("AliasNames") <> "" Then Title = jItem.Value("AliasNames") // Nice name ElseIf jItem.HasName("SeriesName") Then Title = jItem.Value("SeriesName") // Nice name Else Title = "" End If If jItem.HasName("FirstAired") Then ReleaseDate = jItem.Value("FirstAired") If jItem.HasName("banner") Then BannerURL = GraphicsPath + jItem.Value("banner") CommonCore.ShowSearchResult ID, DBID, Title, ReleaseDate, "", "", BannerURL ElseIf TotalResults = 1 Then ShowByID Results.Child(0).Value("id") ElseIf TotalResults = 0 Then Dim IMDbItem as new JSONItem IMDbItem = GetIMDbJSON( ShowName, True ) If IMDbItem <> Nil And IMDbItem.HasName("TITLE_ID") Then TotalResults = 1 If ManualSearch Then Dim FanartURL as String If IMDbItem.HasName("MEDIA_IMAGES") And IMDbItem.Child("MEDIA_IMAGES").Count > 0 Then FanartURL = IMDbItem.Child("MEDIA_IMAGES").Value(0) CommonCore.ShowSearchResult( IMDbItem.Value("TITLE_ID"), "", IMDbItem.Value("TITLE"), IMDbItem.Value("RELEASE_DATE"), IMDbItem.Value("POSTER"), FanartURL, "" ) Else ShowByID( IMDbItem.Value("TITLE_ID") ) End If End If End If dlgProgress.Close Return #If TargetLinux Then Dim Sckt as New TVDBSckt Dim JSONString as String dlgProgress.Add( Loc.kSearching + ":", ShowName ) JSONString = DefineEncoding( Sckt.Get( URL( "Search", ShowName.ReplaceAll( " - ", " " ) ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) Sckt.Close Dim jTVDB as New JSONItem jTVDB = JSONString.ConvertEncoding( Encodings.UTF8 ).XML2JSON Dim TotalResults as Integer = 0 If jTVDB <> Nil And jTVDB.HasName("Data") And _ jTVDB.ToString.InStr( 0, "Series" ) <> 0 And _ jTVDB.Child("Data").HasName("Series") And _ jTVDB.Child("Data").Child("Series").Count > 0 Then If jTVDB.Child("Data").Child("Series").IsArray Then Dim IDs() as String For i as Integer = 0 to jTVDB.Child("Data").Child("Series").Count - 1 Dim jItem as New JSONItem jItem = jTVDB.Child("Data").Child("Series").Child(i) If jItem.HasName("SeriesName") And jItem.Value("SeriesName").Instr( "* duplicate of" ) > 0 Then Continue Dim b as Boolean = False For n as Integer = 0 to IDs.Ubound If jItem.HasName("id") And jItem.Value("id") = IDs(n) Then b = True Exit End If Next If b Then Continue IDs.Append jItem.Value("id") TotalResults = TotalResults + 1 Next Dim s as String 'TotalResults = jTVDB.Child("Data").Child("Series").Count Else TotalResults = 1 End If Else If JSONString.InStr( "Website is currently unreachable" ) > 0 Then MessageBox "TVDB is currently unreachable" Else MessageBox kNoShowsFoundTryAgain End If If NOT ManualSearch Then wndSearch.Show wndSearch.ccSearchBox.edtSearch.Text = ShowName.ReplaceAll(" - ", " ") End If Return End If // If too many or too little results, try IMDB Search. If ( TotalResults <= 0 And ManualSearch ) Or TotalResults > 99 Then 'Dim jsonIMDb as String = IMDBjson( ShowName ) Dim IMDbItem as New JSONItem IMDbItem = GetIMDbJSON( ShowName, True ) 'If jsonIMDb.ValidJSON( "IMDb Search" ) Then IMDbItem.Load( jsonIMDb ) If IMDbItem.HasName("TITLE_ID") Then TotalResults = 1 If ManualSearch Then Dim FanartURL as String If IMDbItem.HasName("MEDIA_IMAGES") And IMDbItem.Child("MEDIA_IMAGES").Count > 0 Then FanartURL = IMDbItem.Child("MEDIA_IMAGES").Value(0) CommonCore.ShowSearchResult( IMDbItem.Value("TITLE_ID"), "", IMDbItem.Value("TITLE"), IMDbItem.Value("RELEASE_DATE"), IMDbItem.Value("POSTER"), FanartURL, "" ) dlgProgress.Close Return Else ShowByID IMDbItem.Value("TITLE_ID") End If End If Return End If If jTVDB.Child("Data").Child("Series").IsArray And TotalResults > 1 Then Dim ID(), DBID(), Title(), ReleaseDate(), PosterURL(), FanartURL(), BannerURL() as String For i as Integer = 0 to TotalResults - 1 Dim jItem as New JSONItem jItem = jTVDB.Child("Data").Child("Series").Child(i) // Detect duplicate entries Dim b as Boolean = False For n as Integer = 0 to ID.Ubound // Ignore duplicates entries with different IDs If jItem.HasName("SeriesName") And jItem.Value("SeriesName").Instr( "** duplicate of" ) > 0 Then b = True Exit End If // Ignore duplicate entires with same IDs If jItem.HasName("id") And jItem.Value("id") = DBID(n) Then If jItem.HasName("SeriesName") And Len( jItem.Value("SeriesName") ) > Len( Title(n) ) Then Title(n) = jItem.Value("SeriesName") b = True Exit End If Next If b Then Continue If jItem.HasName("IMDB_ID") Then ID.Append jItem.Value("IMDB_ID") Else ID.Append "" If jItem.HasName("id") Then DBID.Append jItem.Value("id") Else DBID.Append "" If jItem.HasName("SeriesName") Then Title.Append jItem.Value("SeriesName") Else Title.Append "" If jItem.HasName("FirstAired") Then ReleaseDate.Append jItem.Value("FirstAired") Else ReleaseDate.Append "" PosterURL.Append "" FanartURL.Append "" If jItem.HasName("banner") Then BannerURL.Append GraphicsPath + jItem.Value("banner") else BannerURL.Append "" Next CommonCore.ShowSearchResults ID, DBID, Title, ReleaseDate, PosterURL, FanartURL, BannerURL ElseIf TotalResults = 1 And ManualSearch Then Dim jItem as New JSONItem jItem = jTVDB.Child("Data").Child("Series") Dim ID, DBID, Title, ReleaseDate, PosterURL, FanartURL, BannerURL as String If jItem.HasName("IMDB_ID") Then ID = jItem.Value("IMDB_ID") If jItem.HasName("id") Then DBID = jItem.Value("id") If jItem.HasName("SeriesName") Then Title = jItem.Value("SeriesName") If jItem.HasName("FirstAired") Then ReleaseDate = jItem.Value("FirstAired") If jItem.HasName("banner") Then BannerURL = GraphicsPath + jItem.Value("banner") CommonCore.ShowSearchResult ID, DBID, Title, ReleaseDate, "", "", BannerURL ElseIf TotalResults = 1 Then Dim jItem as New JSONItem jItem = jTVDB.Child("Data").Child("Series") ShowByID jItem.Value("id") ElseIf TotalResults = 0 Then Dim IMDbItem as new JSONItem IMDbItem = GetIMDbJSON( ShowName, True ) If IMDbItem <> Nil And IMDbItem.HasName("TITLE_ID") Then TotalResults = 1 If ManualSearch Then Dim FanartURL as String If IMDbItem.HasName("MEDIA_IMAGES") And IMDbItem.Child("MEDIA_IMAGES").Count > 0 Then FanartURL = IMDbItem.Child("MEDIA_IMAGES").Value(0) CommonCore.ShowSearchResult( IMDbItem.Value("TITLE_ID"), "", IMDbItem.Value("TITLE"), IMDbItem.Value("RELEASE_DATE"), IMDbItem.Value("POSTER"), FanartURL, "" ) Else ShowByID( IMDbItem.Value("TITLE_ID") ) End If End If End If dlgProgress.Close Return #endif End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowStatus(ShowName as String, TVDBID as String = "") ShowStatusTVMaze( ShowName, TVDBID ) 'ShowStatusTVRage( ShowName ) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowStatusAll() Dim LstBox as Listbox = wndMain.lstTVShadow CommonCore.MassSearch = True ReDim CommonCore.UnFoundTitles(-1) ReDim CommonCore.UnfoundPaths(-1) For i as Integer = 0 to LstBox.ListCount - 1 If LstBox.Cell( i, 2 ) = "" Then Continue // Only update scraped shows. TVAttr.FolderParent = GetFolderItem( LstBox.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue // Only update if exists TVAttr.ClearProperties // Also gets done in NFORead, but just for sure. TVAttr.NFORead( TVAttr.FolderParent ) 'If TVAttr.Locked Then Continue Dim Title as String = TVAttr.Title 'Original 'Dim Year as Integer = TVAttr.DateYear Dim PreviousStatus as String = TVAttr.Status Dim PreviousAired as String = TVAttr.NextAired_Date' + " - " + TVAttr.NextAired_Episode If PreviousAired = "" Then PreviousAired = TVAttr.LastAired_Date dlgProgress.Add( Loc.kDownloading + ":", Title.ReplaceAll("&", "&&") + " " + Loc.kStatus.ReplaceAll(":","...").Lowercase ) // Do your thing! ShowStatus( Title, TVAttr.ID_TVDB ) 'If JSON = Nil Then 'If NOT Growl.Notify( Title + " " + Loc.kStatus.ReplaceAll(":",""), Loc.msg404TV ) Then '// NOT Growling? 'End If 'CommonCore.UnfoundTitles.Append Title + EndOfLine + "No TVRage ID found" 'CommonCore.UnfoundPaths.Append TVAttr.FolderParent 'End If If TVAttr.Status <> PreviousStatus Then If TVAttr.Status.InStr( 0, "Ended" ) > 0 OR TVAttr.Status = TVStatus_Ended Then CommonCore.UnfoundTitles.Append Title + " " + kStatusChangedCanceled ElseIf Trim( PreviousStatus ) = "" Then CommonCore.UnfoundTitles.Append Title + " " + kStatusHasChanged + " " + TVAttr.Status.Lowercase + "." Else CommonCore.UnfoundTitles.Append Title + " " + kStatusChangedFrom + " " + PreviousStatus.Lowercase + " " + Loc.kTo + " " + TVAttr.Status.Lowercase + "." End If CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If If PreviousAired = "" And TVAttr.NextAired_Date <> "" Then CommonCore.UnfoundTitles.Append Title + " " + kStatusChangedToAired + " " + CountHours( TVAttr.NextAired_Date, True ).Lowercase CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If 'If TVAttr.NextAired_Date + " - " + TVAttr.NextAired_Episode <> PreviousAired Then 'CommonCore.UnfoundTitles.Append "Airing information changed:" + EndOfLine + "[Prev] " + PreviousAired + EndOfLine + "[New] " + TVAttr.NextAired_Date + " - " + TVAttr.NextAired_Episode 'CommonCore.UnfoundPaths.Append TVAttr.FolderParent 'End If TVAttr.NFOWrite( TVAttr.FolderParent ) wndMain.lstTVShows.UpdateRow( i, Nil, True ) Next If CommonCore.UnfoundTitles.Ubound > -1 Then CommonCore.ShowUnfoundTitles( kStatusChanges ) ReDim CommonCore.UnfoundTitles(-1) ReDim CommonCore.UnfoundPaths(-1) CommonCore.MassSearch = False wndMain.lstSearch.CopyFrom( wndMain.lstTVShadow ) wndMain.lstTVShows.ResetFolderStatus End Sub #tag EndMethod #tag Method, Flags = &h21 Private Sub ShowStatusTVMaze(ShowName as String, TVDBID as String = "") If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Return App.ErrorMessage = "Just Starting" dim sckt as new TVMaze sckt.Yield = True dim content as string if TVDBID <> "" then content = trim( DefineEncoding( sckt.Get( URLCore.TVMaze( TVDBID, "LookUp" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) else content = trim( DefineEncoding( sckt.Get( URLCore.TVMaze( ShowName, "Search" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) end if // Redirected if sckt <> Nil and sckt.HTTPStatusCode = 301 and sckt.PageHeaders <> Nil then dim redirectURL as string = sckt.PageHeaders.Value( "Location" ) content = trim( DefineEncoding( sckt.Get( redirectURL, Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) end if dim ShowInfo as JSONItem if content <> "" and content.Left( 1 ) = "{" then ShowInfo = New JSONItem( content ) end if if ShowInfo <> Nil then // Reset previous TVAttr.NextAired_Date = "" TVAttr.NextAired_Episode = "" TVAttr.LastAired_Date = "" TVAttr.LastAired_Episode = "" // Show Status dim status as string = ShowInfo.Lookup( "status", "" ) Select case status case "Running" TVAttr.Status = TVStatus_ReturningSeries case "Ended" TVAttr.Status = TVStatus_Ended case "To Be Determined" TVAttr.Status = TVStatus_Bubble case "In Development" TVAttr.Status = TVStatus_Development else TVAttr.Status = "" End Select // Get Next/Previous episode URLs dim NextEpisodeURL as string dim PreviousEpisodeURL as String if ShowInfo.HasName( "_links" ) then dim links as JSONItem = ShowInfo.Value( "_links" ) if links <> Nil and links.HasName( "nextepisode" ) then dim nextep as JSONItem = links.Value( "nextepisode" ) if nextep <> Nil and nextep.HasName( "href" ) then NextEpisodeURL = nextep.Value( "href" ) end if end if if links <> Nil and links.HasName( "previousepisode" ) then dim prevep as JSONItem = links.Value( "previousepisode" ) if prevep <> Nil and prevep.HasName( "href" ) then PreviousEpisodeURL = prevep.Value( "href" ) end if end if end if // Get Next Episode information dim NextEpisodeInfo as JSONItem if NextEpisodeURL <> "" then dim NextEpInfo as string = trim( DefineEncoding( sckt.Get( NextEpisodeURL, Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) if NextEpInfo <> "" and NextEpInfo.Left(1) = "{" then NextEpisodeInfo = New JSONItem( NextEpInfo ) end if end if // Format next episode information if NextEpisodeInfo <> Nil and NextEpisodeInfo.Count > 0 then // Season/Episode - Name dim season as string = NextEpisodeInfo.Lookup( "season", "" ) if season.Len = 1 then season = "0" + season end if dim episode as string = NextEpisodeInfo.Lookup( "number", "" ) if episode.Len = 1 then episode = "0" + episode end if dim name as string = NextEpisodeInfo.Lookup( "name", "" ) if name <> "" then name = " - " + name end if TVAttr.NextAired_Episode = "S" + season + "E" + episode + name // Airdate // Because i did something silly with date formatting: dim NextAiredDate as new NativeSubclass.DateExtended dim date as string = NextEpisodeInfo.Lookup("airstamp","") if date <> "" then NextAiredDate.ISO8601 = date end if dim SillyDate as string = NextAiredDate.ISO8601.Replace(":00-", ":00G-").Replace(":00+", ":00G+").Replace(":00Z",":00G+") 'TVAttr.NextAired_Date = SillyDate 'dim date as string = NextEpisodeInfo.Lookup( "airdate", "" ) 'dim time as string = NextEpisodeInfo.Lookup( "airtime", "" ) 'dim combo as string = date + "T" + time + ":00" ' 'dim gmt as string = NextEpisodeInfo.Lookup( "airstamp", "" ) 'if gmt <> "" then 'gmt = gmt.ReplaceAll( combo, "" ) 'end if ' 'dim sillydate as string = date + "T" + time + "G" + gmt TVAttr.NextAired_Date = sillydate end if // Get Previous Episode information dim PreviousEpisodeInfo as JSONItem if PreviousEpisodeURL <> "" then dim PrevEpInfo as string = trim( DefineEncoding( sckt.Get( PreviousEpisodeURL, Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) if PrevEpInfo <> "" and PrevEpInfo.Left(1) = "{" then PreviousEpisodeInfo = New JSONItem( PrevEpInfo ) end if end if // Format previous episode information if PreviousEpisodeInfo <> Nil and PreviousEpisodeInfo.Count > 0 then // Season/Episode - Name dim season as string = PreviousEpisodeInfo.Lookup( "season", "" ) if season.Len = 1 then season = "0" + season end if dim episode as string = PreviousEpisodeInfo.Lookup( "number", "" ) if episode.Len = 1 then episode = "0" + episode end if dim name as string = PreviousEpisodeInfo.Lookup( "name", "" ) if name <> "" then name = " - " + name end if TVAttr.LastAired_Episode = "S" + season + "E" + episode + name // Airdate // Because i did something silly with date formatting: dim LastAiredDate as new NativeSubclass.DateExtended dim date as string = PreviousEpisodeInfo.Lookup("airstamp","") if date <> "" then LastAiredDate.ISO8601 = date end if dim SillyDate as string = LastAiredDate.ISO8601.Replace(":00-", ":00G-").Replace(":00+", ":00G+").Replace(":00Z",":00G+") TVAttr.LastAired_Date = SillyDate 'dim date as string = PreviousEpisodeInfo.Lookup( "airdate", "" ) 'dim time as string = PreviousEpisodeInfo.Lookup( "airtime", "" ) 'dim combo as string = date + "T" + time + ":00" ' 'dim gmt as string = PreviousEpisodeInfo.Lookup( "airstamp", "" ) 'if gmt <> "" then 'gmt = gmt.ReplaceAll( combo, "" ) 'end if ' 'TVAttr.LastAired_Date = date + "T" + time + "G" + gmt end if // Set folder label colors If Prefs.boolForKey("MatchFinderLabelsToTVStatus") Then Dim Clock as String = CountHours( TVAttr.NextAired_Date ) Dim Hours as Integer = Val( Clock ) If Clock <> "" Then App.ErrorMessage = "Clock <> """"" // Today & This week If Hours > -24 And Round( Hours / 24 ) <= 7 Then LabelIndexSet( TVAttr.FolderParent, 6 ) // Later then this week, but within a Month (30 days) If Round( Hours / 24 ) > 7 And Round( Hours / 24 ) <= 30 Then LabelIndexSet( TVAttr.FolderParent, 3 ) // Upcoming / Hiatus If Round( Hours / 24 ) > 30 Then LabelIndexSet( TVAttr.FolderParent, 1 ) Else App.ErrorMessage = "Clock = """"" // To be announced LabelIndexSet( TVAttr.FolderParent, 4 ) End If App.ErrorMessage = "Other Label Colors" If Status.InStr( 0, "In Development" ) > 0 Then LabelIndexSet( TVAttr.FolderParent, 5 ) // Future If Status.Contains( "Ended" ) OR Status.Contains("rejected") OR Status.Contains("Cancel") Then LabelIndexSet( TVAttr.FolderParent, 2 ) // Ended If TVAttr.Status = TVStatus_PilotRejected OR TVAttr.Status = TVStatus_Ended Then LabelIndexSet( TVAttr.FolderParent, 2 ) // Ended End If // @END MatchFinderLabelsToTVStatus end if End Sub #tag EndMethod #tag Method, Flags = &h21 Private Sub ShowStatusTVRage(Title as String) // TVRage Status': // 'In Development' / Future // 'Pilot Ordered' / Future // 'Pilot Rejected' / Ended? // 'Final Season' / Continuing // 'Returning Series' / Continuing // 'On Hiatus' / Hiatus // 'TBD/On The Bubble' / Hiatus // 'Canceled/Ended' / Ended // 'New Series' / Continuing 'Return // TVRAGE DOWN If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Return App.ErrorMessage = "Just Starting" Title = Title.ReplaceAll(":","").ReplaceAll(" & "," and ") Dim sckt as New TVDBSckt sckt.Yield = True // Get QuickInfo Dim QuickInfo as String = DefineEncoding( sckt.Get( URLCore.TVRage( String2Entities( Title ), "InfoQuick" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'dim TVRageTitle, SimplifiedTitle as String 'SimplifiedTitle = Trim( RegExThis( Title, "\([0-9][0-9][0-9][0-9]\)" ) ) 'TVRageTitle = QuickInfo.Mid( QuickInfo.InStr("Show Name@"), QuickInfo.InStr( EndOfLine ) ) ' 'if NOT QuickInfo.Contains( Title ) then 'QuickInfo = DefineEncoding( sckt.Get( URLCore.TVRage( String2Entities( Title ), "InfoQuick" ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) 'sckt.Close 'end if App.ErrorMessage = "QuickInfo 1" If QuickInfo.Left(7) = "No Show" Then App.ErrorMessage = "Growling/NotificationCenter" If NOT nc.Available Then If NOT Growl.Notify( "[TVRage] " + Title + " " + Loc.kStatus.ReplaceAll(":",""), Loc.kCouldNotBeFound.ReplaceAll("%s", Title) ) Then // NOT Growling? 'If DebugBuild Then MessageBox "TV Rage cannot find the show: " + Title End If Else nc.Message "[TVRage] " + Loc.kCouldNotBeFound.ReplaceAll("%s", Title) End If If CommonCore.MassSearch Then CommonCore.UnfoundTitles.Append Title + EndOfLine + "No TVRage show found" CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If Return End If App.ErrorMessage = "QuickInfo 2" If QuickInfo.InStr( 0, "Service currently unavailable due to maintenance" ) > 0 Then MessageBox "TVRage Service currently unavailable due to maintenance." Return End If App.ErrorMessage = "QuickInfo 3" If QuickInfo.MyMid( "Show ID@", EndOfLine.UNIX ) = "" Then // Try again App.ErrorMessage = "QuickInfo Try Again" QuickInfo = DefineEncoding( sckt.Get( URLCore.TVRage( String2Entities( Title ), "InfoQuick" ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) If QuickInfo.MyMid( "Show ID@", EndOfLine.UNIX ) = "" Then If NOT nc.Available Then If NOT Growl.Notify( "[TVRage] " + Title + " " + Loc.kStatus.ReplaceAll(":",""), Loc.kCouldNotBeFound.ReplaceAll("%s", Title) ) Then // NOT Growling? 'If DebugBuild Then MessageBox Loc.kCouldNotBeFound.ReplaceAll("%s", Title) End If Else nc.Message "[TVRage] " + Loc.kCouldNotBeFound.ReplaceAll("%s", Title) End If If CommonCore.MassSearch Then CommonCore.UnfoundTitles.Append Title + EndOfLine + kNoTVRageIDFound CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If 'If DebugBuild Then MessageBox "Quickinfo:" + EndOfLine + EndOfLine + QuickInfo Return End If End If TVAttr.ID_TVRage = QuickInfo.MyMid( "Show ID@", EndOfLine.UNIX ) // Get XML/JSON Dim JSONString as String Dim TVRage as New JSONItem If QuickInfo.InStr( 0, "RFC3339@" ) = 0 And QuickInfo.InStr( 0, "Show ID@" ) > 0 Then App.ErrorMessage = "JSON String Processing" JSONString = DefineEncoding( sckt.Get( URLCore.TVRage( TVAttr.ID_TVRage, "InfoFull" ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) 'JSONString = RegExThis( JSONString, ".*?", "" ) 'JSONString = RegExThis( JSONString, " country=""(.*?)""", "" ) 'JSONString = JSONString.XML2JSON 'If JSONString.ValidJSON("TVRage JSON") Then TVRage.Load JSONString TVRage = JSONString.XML2JSON If TVRage <> Nil And TVRage.HasName("Showinfo") And TVRage.Child("Showinfo").HasName("showid") Then TVRage = TVRage.Child("Showinfo") End If Dim EpisodeNr, EpisodeTitle, EpisodeAirDate as String App.ErrorMessage = "Next/last episode" // ## Latest/last episode Dim NextAiredInfo as String = QuickInfo.MyMid( "RFC3339@", EndOfLine.UNIX ) Dim Date as String = NextAiredInfo.NthField( "T", 1 ) Dim Time as String = NextAiredInfo.NthField( "T", 2 ).NthField( ":", 1 ) + ":" + NextAiredInfo.NthField( "T", 2 ).NthField( ":", 2 ) Dim GMT as String = NextAiredInfo.ReplaceAll( Date + "T" + Time, "" ).ReplaceAll( ":00", "" ) If QuickInfo.InStr( 0, "RFC3339@" ) = 0 Then GMT = Trim( QuickInfo.MyMid( "GMT", EndOfLine.UNIX ).ReplaceAll("NODST","").ReplaceAll("DST", "").ReplaceAll("@","") ) Time = Trim( match( ".* at (.*?) ", QuickInfo.MyMid( "Airtime@", EndOfLine.UNIX ), 1 ) ) If QuickInfo.MyMid( "Airtime@", EndOfLine.UNIX ).InStr( 0, "pm" ) > 0 Then Time = Str( Val( Time.NthField(":",1) ) + 12 ) + ":" + Time.NthField(":",2) End If End If If QuickInfo.InStr( 0, "GMT" ) = 0 Then GMT = "0" If TVRage <> Nil And TVRage.HasName("timezone") And TVRage.Value("timezone") <> "" Then GMT = Str( Val( TVRage.Value("timezone").ReplaceAll( "GMT", "" ).ReplaceAll( "DST", "" ) ) ) End If App.ErrorMessage = "Latest episode" // Latest episode Dim LatestEpisode() as String = Split( QuickInfo.MyMid( "Latest Episode@", EndOfLine.UNIX ), "^" ) If QuickInfo.InStr(0, "Latest Episode@") > 0 And LatestEpisode.Ubound > -1 Then TVAttr.LastAired_Episode = "S"+ LatestEpisode(0).ReplaceAll( "x", "E" ) + " - " + LatestEpisode(1) TVAttr.LastAired_Date = TVRageDate2Date( LatestEpisode(2) ) + "T" + Time + "G" + GMT 'If TVRage.HasName("airtime") And TVRage.Value("airtime") <> "" Then 'TVAttr.LastAired_Date = TVAttr.LastAired_Date + "T" + TVRage.Value("airtime") 'End If ' 'If TVRage.HasName("timezone") And TVRage.Value("timezone") <> "" Then 'TVAttr.LastAired_Date = TVAttr.LastAired_Date + "G" + TVRage.Value("timezone").ReplaceAll("GMT","").ReplaceAll("-DST","") 'End If Else TVAttr.LastAired_Date = "" TVAttr.LastAired_Episode = "" End If // Debug Dim LastAiredE as String = TVAttr.LastAired_Episode Dim LastAiredD as String = TVAttr.LastAired_Date App.ErrorMessage = "Next Episode" // ## Next episode Dim NextEpisode() as String = Split( QuickInfo.MyMid( "Next Episode@", EndOfLine.UNIX ), "^" ) If QuickInfo.InStr(0, "Next Episode@") > 0 And NextEpisode.Ubound > -1 Then TVAttr.NextAired_Episode = "S" + NextEpisode(0).ReplaceAll( "x", "E" ) + " - " + NextEpisode(1) TVAttr.NextAired_Date = TVRageDate2Date( NextEpisode(2) ) + "T" + Time + "G" + GMT 'If TVRage.HasName("airtime") And TVRage.Value("airtime") <> "" Then 'TVAttr.NextAired_Date = TVAttr.NextAired_Date + "T" + TVRage.Value("airtime") 'End If ' 'If TVRage.HasName("timezone") And TVRage.Value("timezone") <> "" Then 'TVAttr.NextAired_Date = TVAttr.NextAired_Date + "G" + TVRage.Value("timezone").ReplaceAll("GMT","").ReplaceAll("-DST","") 'End If Else TVAttr.NextAired_Date = "" TVAttr.NextAired_Episode = "" End If // ## Date Premiered 'If QuickInfo.InStr( 0, "Started@" ) > 0 Then TVAttr.DatePremiered = TVRageDate2Date( QuickInfo.MyMid( "Started@", EndOfLine.UNIX ) ) // ## Date Ended App.ErrorMessage = "Date Ended" If QuickInfo.InStr( 0, "Ended@" ) > 0 Then TVAttr.DateEnded = TVRageDate2Date( QuickInfo.MyMid( "Ended@", EndOfLine.UNIX ) ) // ## Status App.ErrorMessage = "Status" Dim Status as String If QuickInfo.InStr( 0, "Status@" ) > 0 Then Status = QuickInfo.MyMid( "Status@", EndOfLine.UNIX ) If Status = "" Then Status = "Hiatus" TVAttr.Status = Status Select Case Status Case "In Development" TVAttr.Status = TVStatus_Development Case "Pilot Ordered" TVAttr.Status = TVStatus_PilotOrdered Case "Final Season" TVAttr.Status = TVStatus_FinalSeason Case "Returning Series" TVAttr.Status = TVStatus_ReturningSeries Case "On Hiatus" TVAttr.Status = TVStatus_Hiatus Case "TBD/On The Bubble" TVAttr.Status = TVStatus_Bubble Case "Canceled/Ended" TVAttr.Status = TVStatus_Ended Case "New Series" TVAttr.Status = TVStatus_NewSeries Case "Pilot Rejected" TVAttr.Status = TVStatus_PilotRejected Case "Never Aired" //' TODO Else TVAttr.Status = Status End Select // ## Runtime App.ErrorMessage = "Runtime" If QuickInfo.InStr( 0, "Runtime@" ) > 0 Then TVAttr.DurationRuntime = Val( QuickInfo.MyMid( "Runtime@", EndOfLine.UNIX ) ) // ## Country App.ErrorMessage = "Country" If QuickInfo.InStr( 0, "Country@" ) > 0 Then TVAttr.Countries.Append QuickInfo.MyMid( "Country@", EndOfLine.UNIX ) // ## Classification App.ErrorMessage = "Classification" If QuickInfo.InStr( 0, "Classification@" ) > 0 Then TVAttr.Classification = QuickInfo.MyMid( "Classification@", EndOfLine.UNIX ) App.ErrorMessage = "Set folder label colors" // Set folder label colors If Prefs.boolForKey("MatchFinderLabelsToTVStatus") Then Dim Clock as String = CountHours( TVAttr.NextAired_Date ) Dim Hours as Integer = Val( Clock ) If Clock <> "" Then App.ErrorMessage = "Clock <> """"" // Today & This week If Hours > -24 And Round( Hours / 24 ) <= 7 Then LabelIndexSet( TVAttr.FolderParent, 6 ) // Later then this week, but within a Month (30 days) If Round( Hours / 24 ) > 7 And Round( Hours / 24 ) <= 30 Then LabelIndexSet( TVAttr.FolderParent, 3 ) // Upcoming / Hiatus If Round( Hours / 24 ) > 30 Then LabelIndexSet( TVAttr.FolderParent, 1 ) Else App.ErrorMessage = "Clock = """"" // To be announced LabelIndexSet( TVAttr.FolderParent, 4 ) End If App.ErrorMessage = "Other Label Colors" If Status.InStr( 0, "In Development" ) > 0 Then LabelIndexSet( TVAttr.FolderParent, 5 ) // Future If Status.Contains( "Ended" ) OR Status.Contains("rejected") OR Status.Contains("Cancel") Then LabelIndexSet( TVAttr.FolderParent, 2 ) // Ended If TVAttr.Status = TVStatus_PilotRejected OR TVAttr.Status = TVStatus_Ended Then LabelIndexSet( TVAttr.FolderParent, 2 ) // Ended End If App.ErrorMessage = "" Exception err as NilObjectException Dim w as New wndBugReporter w.Init( err, App.ErrorMessage ) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdate(ID as String) If TVAttr.Locked Then If NOT CommonCore.MassSearch Then MessageBox Loc.kIsLocked.ReplaceAll("%@", TVAttr.Title) Return End If Dim LstBox as Listbox = wndMain.lstTVShadow 'CommonCore.MassSearch = False If ID = "" Then MessageBox Loc.msgNoIDTV.ReplaceAll( "%S", TVAttr.FolderParent.Name ) Return End If // Reset current search. If NOT CommonCore.MassSearch Then wndMain.ccSearchBoxTVShows.edtSearch.Text = "" If wndMain.lstTVShows.SelCount > 1 Then CommonCore.MassSearch = True dlgProgress.Reset For i as Integer = 0 to wndMain.lstTVShows.ListCount -1 dlgProgress.Add( Loc.kDownloading +":", wndMain.lstTVShows.Cell( i, 0 ), 1, wndMain.lstTVShows.ListCount ) If NOT wndMain.lstTVShows.Selected(i) OR wndMain.lstTVShows.RowTag( i ) = "Folder" Then Continue If wndMain.lstTVShows.Cell( i, 1 ) <> "" Then TVAttr.FolderParent = GetFolderItem( wndMain.lstTVShows.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue If wndMain.lstTVShows.Cell( i, 2 ) = "" Then Continue TVAttr.NFORead( TVAttr.FolderParent ) If TVAttr.ID_TVDB <> "" Then ShowByID( TVAttr.ID_TVDB ) ElseIf TVAttr.ID_IMDb <> "" Then ShowByID( TVAttr.ID_IMDb ) Else Continue End If wndMain.lstTVShows.UpdateRow( i ) Next CommonCore.MassSearch = False Else If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", TVAttr.FolderParent.Name ) ShowByID ID, True End If If NOT CommonCore.MassSearch Then wndMain.lstTVShows.UpdateRow( LstBox.ListIndex ) wndMain.lstTVShows.Sort() TVAttr.LoadImages( TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload() End If Return End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdateAll() Dim LstBox as Listbox = wndMain.lstTVShadow CommonCore.MassSearch = True ReDim CommonCore.UnFoundTitles(-1) ReDim CommonCore.UnfoundPaths(-1) For i as Integer = 0 to LstBox.ListCount - 1 If LstBox.Cell( i, 2 ) = "" Then Continue // Only update scraped shows. TVAttr.FolderParent = GetFolderItem( LstBox.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue // Only update if exists TVAttr.ClearProperties // Also gets done in NFORead, but just for sure. TVAttr.NFORead( TVAttr.FolderParent ) If TVAttr.Locked Then Continue Dim Title as String = TVAttr.Title Dim ID as String = TVAttr.ID_TVDB If ID = "" Then ID = TVAttr.ID_IMDb dlgProgress.Add( Loc.kUpdating + ":", Title.ReplaceAll("&", "&&") + " " + Loc.mTabInfo.Lowercase + "..." ) ShowUpdate( ID ) TVAttr.NFOWrite( TVAttr.FolderParent ) wndMain.lstTVShows.UpdateRow( i, Nil, True ) Next If CommonCore.UnfoundTitles.Ubound > -1 Then CommonCore.ShowUnfoundTitles( "TV Show Status changes" ) CommonCore.MassSearch = False wndMain.lstSearch.CopyFrom( wndMain.lstTVShadow ) 'wndMain.lstTVShows.ResetFolderStatus wndMain.lstTVShows.Sort End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdateArt(ID as String) Dim Sckt as New TVDBSckt Dim LstBox as Listbox = wndMain.lstTVShadow // ## If item has not been scraped before, (No ID is available) then continue to the next item. If ID = "" Then Return App.ErrorMessage = "Get Title" Dim Title as String = TVAttr.Title 'LstBox.Cell( Lindex, 0 ) If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Title + " " + Loc.kImages.Lowercase + "..." ) If ID.Left(2) = "tt" Then ID = Sckt.IMDb2TVDB( ID ) // ## TVDB JSON App.ErrorMessage = "Download TVDB JSON" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB] " + Title + "..." ) Else dlgProgress.debug( Loc.kDownloading + " [TVDB] " + Title ) Dim JSONString as String = Sckt.Get( TVCore.URL( "Art", ID ), Prefs.integerForKey("TimeOut") ) Sckt.Close 'JSONString = JSONString.XML2JSON Dim TVDBArt as New JSONItem 'If JSONString.ValidJSON("TVDB Art") Then TVDBArt.Load( JSONString ) TVDBArt = JSONString.XML2JSON App.ErrorMessage = "Set TVDBArt JSON" If TVDBArt <> Nil And TVDBArt.HasName("Banners") And TVDBArt.ToString.InStr("""Banner""") > 0 And TVDBArt.Child("Banners").HasName("Banner") Then TVDBArt = TVDBArt.Child("Banners").Child("Banner") JSONString = "" // ## FanartTV App.ErrorMessage = "Download FanartTV JSON" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[FanartTV] " + Title + "..." ) Else dlgProgress.debug( Loc.kDownloading + " [FanartTV] " + Title ) if DebugBuild or False then dim fanartTVurl as string = URLCore.FanartTV(ID) dim fanartTVJSONString as string' = Sckt.Get( fanartTVurl, 60 ) if fanartTVurl.Contains("https:") then dim secureSckt as new HTTPSecureSocket fanartTVJSONString = secureSckt.Get(fanartTVurl, 60) else fanartTVJSONString = Sckt.Get(fanartTVurl, 60) end if fanartTVJSONString = DefineEncoding( fanartTVJSONString, Encodings.UTF8 ) JSONString = Trim( fanartTVJSONString ) end if JSONString = Trim( DefineEncoding( Sckt.Get( URLCore.FanartTV( ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) ) App.ErrorMessage = "Set FanartTV JSON" Dim FanartTVJSON as New JSONItem If JSONString.ValidJSON("Fanart.TV") Then FanartTVJSON.Load( JSONString ) JSONString = "" // ## And... ACTION! App.ErrorMessage = "Sckt.GetArt( TVDBArt, FanartTVJSON )" Sckt.GetArt( TVDBArt, FanartTVJSON ) // Write NFO App.ErrorMessage = "Write NFO" If NOT CommonCore.MassSearch Then TVAttr.NFOWrite( TVAttr.FolderParent ) wndMain.lstTVShows.UpdateRow TVAttr.LoadImages( TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload End If App.ErrorMessage = "" Exception err as NilObjectException Dim w as New wndBugReporter w.Init( err, "ShowUpdateArt( " + ID + " )" + Chr(13) + App.ErrorMessage ) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdateArtAll() Dim LstBox as Listbox = wndMain.lstTVShadow CommonCore.MassSearch = True For i as Integer = 0 to LstBox.ListCount -1 Dim ID as String = LstBox.Cell( i, 2 ) If ID = "" Then Continue TVAttr.FolderParent = GetFolderItem( LstBox.Cell( i, 1 ), FolderItem.PathTypeShell ) If TVAttr.FolderParent = Nil OR NOT TVAttr.FolderParent.Exists Then Continue TVAttr.NFORead( TVAttr.FolderParent ) If TVAttr.Locked Then Continue dlgProgress.Add( Loc.kDownloading + ":", TVAttr.Title + " " + Loc.kImages.Lowercase + "..." ) If TVAttr.ID_TVDB <> "" Then ShowUpdateArt( TVAttr.ID_TVDB ) Else ShowUpdateArt( TVAttr.ID_IMDb ) End If TVAttr.NFOWrite( TVAttr.FolderParent ) wndMain.lstTVShows.UpdateRow( i, Nil, True ) Next If CommonCore.UnfoundTitles.Ubound > -1 Then CommonCore.ShowUnfoundTitles( "TV Art changes" ) CommonCore.MassSearch = False wndMain.lstSearch.CopyFrom( wndMain.lstTVShadow ) wndMain.lstTVShows.ResetFolderStatus End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShowUpdateRating(ID as String) If ID = "" Then Return Dim Sckt as New TVDBSckt Dim JSONString as String Dim IMDbID as String // :1 TVDB Alias If ID.Left(2) = "tt" Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kUpdating + ":", "[TVDB Alias] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) Else dlgProgress.Debug( "[TVDB Alias] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) End If IMDbID = ID JSONString = DefineEncoding( sckt.Get( TVCore.URL( "InfoAlias", ID ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) sckt.Close 'JSONString = JSONString.XML2JSON Dim TVDBAlias as New JSONItem 'If JSONString.ValidJSON("TVDB Alias") Then TVDBAlias.Load JSONString TVDBAlias = JSONString.XML2JSON If TVDBAlias.HasName("Data") And TVDBAlias.ToString.InStr( 0, "Series" ) > 0 And TVDBAlias.Child("Data").HasName("Series") And TVDBAlias.Child("Data").Child("Series").HasName("id") Then ID = TVDBAlias.Child("Data").Child("Series").Value("id") End If JSONString = "" End If // :2 TVDB Dim TVDB as New JSONItem If ID.Left(2) <> "tt" Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kUpdating + ":", "[TVDB] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) Else dlgProgress.Debug( "[TVDB] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) End If Dim XMLString as String = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID ), Prefs.integerForKey("TimeOut") / 2 ), Encodings.UTF8 ) sckt.Close 'XMLString = DecodingFromHTMLMBS( XMLString ) 'JSONString = XMLString.XML2JSON 'If JSONString.ValidJSON("TVDB Local") Then TVDB.Load JSONString TVDB = XMLString.XML2JSON If TVDB.HasName("Data") And TVDB.ToString.InStr( 0, "Series" ) > 0 And TVDB.Child("Data").HasName("Series") Then TVDB = TVDB.Child("Data").Child("Series") XMLString = "" JSONString = "" End If // IMDb 'Dim IMDbID as String = ID If IMDbID.Left(2) <> "tt" Then If TVDB.HasName("IMDB_ID") And TVDB.Value("IMDB_ID") <> "" Then IMDbID = TVDB.Value("IMDB_ID") End If Dim IMDb as New JSONItem If IMDbID.Left(2) = "tt" Then If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kUpdating + ":", "[IMDb] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) Else dlgProgress.Debug( "[IMDb] " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) End If IMDb = GetIMDbJSON( IMDbID, True ) 'JSONString = IMDBjson( IMDbID, True ) 'JSONString = JSONString 'If JSONString.ValidJSON("IMDb") Then IMDb.Load JSONString 'JSONString = "" End If // -- Process Data If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kProcessing + ":", TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) Else dlgProgress.Debug( Loc.kProcessing + " " + TVAttr.Title + " " + Loc.mRating.ReplaceAll(":","").Lowercase + "..." ) End If // TVDB If TVDB.HasName("Rating") And TVDB.Value("Rating") <> "" Then TVAttr.Rating = TVDB.Value("Rating") If TVDB.HasName("RatingCount") And TVDB.Value("RatingCount") <> "" Then TVAttr.RatingVotes = TVDB.Value("RatingCount") If TVDB.HasName("ContentRating") And TVDB.Value("ContentRating") <> "" Then TVAttr.RatingMPAA = TVDB.Value("ContentRating") If TVDB.HasName("Network") And TVDB.Value("Network") <> "" Then TVAttr.TVNetwork = TVDB.Value("Network") // IMDB If IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then TVAttr.Rating = IMDb.Value("RATING") If IMDb.HasName("VOTES") And IMDb.Value("VOTES") <> "" Then TVAttr.RatingVotes = IMDb.Value("VOTES") If IMDb.HasName("MPAA_RATING") And IMDb.Value("MPAA_RATING") <> "" Then TVAttr.RatingMPAA = IMDb.Value("MPAA_RATING") If IMDb.HasName("RECOMMENDED_TITLES") And IMDb.Child("RECOMMENDED_TITLES").IsArray And IMDb.Child("RECOMMENDED_TITLES").Count > 0 Then ReDim TVAttr.RecShows(-1) ReDim TVAttr.RecShow_IDs(-1) For i as Integer = 0 to IMDb.Child("RECOMMENDED_TITLES").Count -1 Dim RecTitle as String = Trim( RegExThis( IMDb.Child("RECOMMENDED_TITLES").Value(i), "\[.*\]", "" ) ) Dim RecID as String = Trim( RegExThis( IMDb.Child("RECOMMENDED_TITLES").Value(i), ".*\[", "" ) ).ReplaceAll("]","") If RecTitle = "" Then RecTitle = Loc.kNotAvailable TVAttr.RecShows.Append RecTitle TVAttr.RecShow_IDs.Append RecID Next End If TVAttr.NFOWrite( TVAttr.FolderParent ) If NOT CommonCore.MassSearch Then wndMain.lstTVShows.UpdateRow TVAttr.LoadImages( TVAttr.FolderParent ) wndMain.cvsTVShowDetails.Reload End If End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Function URL(sMethod as String, sProperty as String, Lang as String = "", SeasonNr as String = "", EpisodeNr as String = "") As String If Lang = "" Then Lang = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) If Lang = "gb" Then Lang = "en" Select Case sMethod case "Search" Return MirrorPath + "/api/GetSeries.php?seriesname=" + EncodingToURLMBS( sProperty ) + "&language=all" + "&alllang=1" case "InfoAlias" Return "http://thetvdb.com/api/GetSeriesByRemoteID.php?imdbid=" + sProperty' + "&language=" + Lang case "Info" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/all/" + Lang + ".xml" case "InfoShort" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/" + Lang + ".xml" case "EpisodeInfo" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/default/" + SeasonNr + "/" + EpisodeNr + "/ " + Lang + ".xml" case "Episode" Return MirrorPath + "/api/" + ApiKey + "/episodes/" + sProperty + "/" + Lang + ".xml" Case "Actors" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/actors.xml" Case "Art" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/banners.xml" case "EpisodeGuide" Return MirrorPath + "/api/" + ApiKey + "/series/" + sProperty + "/all/" + Lang + ".zip" End Select End Function #tag EndMethod #tag Constant, Name = ApiKey, Type = String, Dynamic = False, Default = \"47B3269189813ECF", Scope = Public #tag EndConstant #tag Constant, Name = GraphicsPath, Type = String, Dynamic = False, Default = \"https://www.thetvdb.com/banners/", Scope = Protected #tag EndConstant #tag Constant, Name = kNoShowsFoundTryAgain, Type = String, Dynamic = True, Default = \"No television series were found\x2C try again with fewer keywords or an alternative title.", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"No television series were found\x2C try again with fewer keywords or an alternative title." #Tag Instance, Platform = Any, Language = nl, Definition = \"Geen televisie series gevonden\x2C probeer opnieuw met minder sleutel woorden of een alternatieve titel." #Tag Instance, Platform = Any, Language = de, Definition = \"Keine Serie gefunden. Versuche es mit weniger Suchw\xC3\xB6rtern oder mit einem anderen Titel." #Tag Instance, Platform = Any, Language = sv, Definition = \"Ingen TV-serie hittades. F\xC3\xB6rs\xC3\xB6k igen med f\xC3\xA4rre nyckelord eller annan titel." #Tag Instance, Platform = Any, Language = fr, Definition = \"Aucune S\xC3\xA9rie TV trouv\xC3\xA9e\x2C veuillez modifier vos mots cl\xC3\xA9s ou essayer un titre alternatif." #tag EndConstant #tag Constant, Name = kNoTVRageIDFound, Type = String, Dynamic = True, Default = \"No TVRage ID found\x2C airing status has not been updated.", Scope = Public #Tag Instance, Platform = Any, Language = en, Definition = \"No TVRage ID found\x2C airing status has not been updated." #Tag Instance, Platform = Any, Language = nl, Definition = \"Geen TVRage ID gevonden\x2C uitzend status is niet veranderd." #Tag Instance, Platform = Any, Language = de, Definition = \"Kein TVRage ID gefunden hat\x2C Broadcast-Status nicht ge\xC3\xA4ndert." #tag EndConstant #tag Constant, Name = kStatusChangedCanceled, Type = String, Dynamic = True, Default = \"has been canceled.", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"has been canceled." #Tag Instance, Platform = Any, Language = nl, Definition = \"is geannuleerd." #Tag Instance, Platform = Any, Language = de, Definition = \"wurde abgesetzt." #Tag Instance, Platform = Any, Language = fr, Definition = \"a \xC3\xA9t\xC3\xA9 annul\xC3\xA9." #tag EndConstant #tag Constant, Name = kStatusChangedFrom, Type = String, Dynamic = True, Default = \"changed status from", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"changed status from" #Tag Instance, Platform = Any, Language = nl, Definition = \"veranderde status van" #Tag Instance, Platform = Any, Language = de, Definition = \"Status \xC3\xA4ndern von" #Tag Instance, Platform = Any, Language = fr, Definition = \"statut modifi\xC3\xA9 depuis" #tag EndConstant #tag Constant, Name = kStatusChangedToAired, Type = String, Dynamic = True, Default = \"has been announced to air in", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"has been announced to air in" #Tag Instance, Platform = Any, Language = nl, Definition = \"is aangekondigt om weer te beginnen in" #Tag Instance, Platform = Any, Language = de, Definition = \"Ausstrahlung angek\xC3\xBCndigt in" #Tag Instance, Platform = Any, Language = fr, Definition = \"a \xC3\xA9t\xC3\xA9 annonc\xC3\xA9 pour \xC3\xAAtre diffus\xC3\xA9 en" #tag EndConstant #tag Constant, Name = kStatusChanges, Type = String, Dynamic = True, Default = \"TV show status changes", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"TV show status changes" #Tag Instance, Platform = Any, Language = nl, Definition = \"Televisie series status veranderingen" #Tag Instance, Platform = Any, Language = de, Definition = \"Serien Status ge\xC3\xA4ndert" #Tag Instance, Platform = Any, Language = fr, Definition = \"Le statut de cette S\xC3\xA9rie TV change" #tag EndConstant #tag Constant, Name = kStatusHasChanged, Type = String, Dynamic = True, Default = \"has been changed to", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"has been changed to" #Tag Instance, Platform = Any, Language = nl, Definition = \"is gewijzigd naar" #Tag Instance, Platform = Any, Language = de, Definition = \"wurde ge\xC3\xA4ndert in" #Tag Instance, Platform = Any, Language = fr, Definition = \"a \xC3\xA9t\xC3\xA9 modifi\xC3\xA9 vers" #tag EndConstant #tag Constant, Name = MirrorPath, Type = String, Dynamic = False, Default = \"https://www.thetvdb.com", Scope = Public #tag EndConstant #tag Constant, Name = TVStatus_Bubble, Type = String, Dynamic = True, Default = \"TBD/On The Bubble", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"TBD/On The Bubble" #Tag Instance, Platform = Any, Language = nl, Definition = \"Onaangekondigd/Op het randje" #Tag Instance, Platform = Any, Language = de, Definition = \"TBD/On The Bubble" #Tag Instance, Platform = Any, Language = fr, Definition = \"TBD/On The Bubble" #tag EndConstant #tag Constant, Name = TVStatus_Development, Type = String, Dynamic = True, Default = \"In Development", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"In Development" #Tag Instance, Platform = Any, Language = nl, Definition = \"In ontwikkeling" #Tag Instance, Platform = Any, Language = de, Definition = \"In Entwicklung" #Tag Instance, Platform = Any, Language = sv, Definition = \"Under produktion" #Tag Instance, Platform = Any, Language = fr, Definition = \"En d\xC3\xA9veloppement" #tag EndConstant #tag Constant, Name = TVStatus_Ended, Type = String, Dynamic = True, Default = \"Canceled/Ended", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Canceled/Ended" #Tag Instance, Platform = Any, Language = nl, Definition = \"Geannuleerd/Be\xC3\xABindigd" #Tag Instance, Platform = Any, Language = de, Definition = \"Abgebrochen/Beendet" #Tag Instance, Platform = Any, Language = sv, Definition = \"Avslutad" #Tag Instance, Platform = Any, Language = fr, Definition = \"Annul\xC3\xA9/Termin\xC3\xA9" #tag EndConstant #tag Constant, Name = TVStatus_FinalSeason, Type = String, Dynamic = True, Default = \"Final Season", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Final Season" #Tag Instance, Platform = Any, Language = nl, Definition = \"Laatste seizoen" #Tag Instance, Platform = Any, Language = de, Definition = \"Letzte Staffel" #Tag Instance, Platform = Any, Language = sv, Definition = \"Sista s\xC3\xA4song" #Tag Instance, Platform = Any, Language = fr, Definition = \"Saison finale" #tag EndConstant #tag Constant, Name = TVStatus_Hiatus, Type = String, Dynamic = True, Default = \"On Hiatus", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"On Hiatus" #Tag Instance, Platform = Any, Language = nl, Definition = \"In hiatus" #Tag Instance, Platform = Any, Language = de, Definition = \"On Hiatus" #Tag Instance, Platform = Any, Language = fr, Definition = \"Interrompu" #tag EndConstant #tag Constant, Name = TVStatus_NewSeries, Type = String, Dynamic = True, Default = \"New Series", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"New Series" #Tag Instance, Platform = Any, Language = nl, Definition = \"Nieuwe Serie" #Tag Instance, Platform = Any, Language = de, Definition = \"Neue Serie" #Tag Instance, Platform = Any, Language = sv, Definition = \"Ny serie" #Tag Instance, Platform = Any, Language = fr, Definition = \"Nouvelles S\xC3\xA9ries" #tag EndConstant #tag Constant, Name = TVStatus_PilotOrdered, Type = String, Dynamic = True, Default = \"Pilot Ordered", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Pilot Ordered" #Tag Instance, Platform = Any, Language = nl, Definition = \"Piloot besteld" #Tag Instance, Platform = Any, Language = de, Definition = \"Pilot bestellt" #Tag Instance, Platform = Any, Language = fr, Definition = \"\"Pilote\" programm\xC3\xA9" #Tag Instance, Platform = Any, Language = sv, Definition = \"Pilot \xC3\xA4r best\xC3\xA4lld" #tag EndConstant #tag Constant, Name = TVStatus_PilotRejected, Type = String, Dynamic = True, Default = \"Pilot Rejected", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Pilot Rejected" #Tag Instance, Platform = Any, Language = nl, Definition = \"Piloot afgekeurd" #Tag Instance, Platform = Any, Language = fr, Definition = \"\"Pilote\" non programm\xC3\xA9" #tag EndConstant #tag Constant, Name = TVStatus_ReturningSeries, Type = String, Dynamic = True, Default = \"Returning Series", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Returning Series" #Tag Instance, Platform = Any, Language = nl, Definition = \"Terugkerende serie" #Tag Instance, Platform = Any, Language = de, Definition = \"Reaktivierte Serie" #Tag Instance, Platform = Any, Language = sv, Definition = \"\xC3\x85terkommande avsnitt" #Tag Instance, Platform = Any, Language = fr, Definition = \"S\xC3\xA9ries r\xC3\xA9currentes" #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Index" Visible=true Group="ID" InitialValue="-2147483648" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag EndViewBehavior End Module #tag EndModule \ No newline at end of file diff --git a/ViMM/CoreServices/TVDBSckt.rbbas b/ViMM/CoreServices/TVDBSckt.rbbas old mode 100755 new mode 100644 index e8a4a09..f0e0d60 --- a/ViMM/CoreServices/TVDBSckt.rbbas +++ b/ViMM/CoreServices/TVDBSckt.rbbas @@ -1 +1 @@ -#tag Class Protected Class TVDBSckt Inherits HTTPSocket #tag Event Sub Error(code as integer) If CommonCore.MassSearch Then CommonCore.UnfoundPaths.Append TVAttr.FolderParent CommonCore.UnfoundTitles.Append "HTTP Error: " + str(code) + " occured." End If SocketError( code, Me ) Exception err as NilObjectException Me.Close End Sub #tag EndEvent #tag Method, Flags = &h0 Sub GetArt(TVDBArt as JSONItem, FanartTVJSON as JSONItem) Dim Info as String = "GetArt( TVDBArt : " + Str( TVDBArt <> Nil ) + ", FanartTVJSON : " + Str( FanartTVJSON <> Nil ) + " ) - " App.ErrorMessage = Info + "Start" Dim Sckt as New TVDBSckt Sckt.Yield = True Dim TimeOut as Integer = Prefs.integerForKey("TimeOut") Dim Lang as String = Prefs.stringForKey("DBLanguage") If Lang = "gb" Then Lang = "en" App.ErrorMessage = Info + "Process TVDB Art" // ## TVDB Art // :9 Dim LastValue as Integer = dlgProgress.ProgressValue Dim LastMax as Integer = dlgProgress.ProgressMax If NOT CommonCore.MassSearch Then dlgProgress.Reset If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kProcessing + ":", "TVDB " + Loc.kImages + " " + Loc.mTabInfo + "..." ) Else dlgProgress.debug( "TVDB " + Loc.kImages + " " + Loc.mTabInfo + "..." ) If TVDBArt <> Nil And NOT TVDBArt.IsArray Then Dim jT as New JSONItem jT.Append( TVDBArt ) TVDBArt = jT End If Dim FirstPoster, FirstFanart, FirstBanner, SeasonLanguage(), SeasonPosterURLs(), SeasonPosterNrs(), SeasonBannerURLs(), SeasonBannerNrs(), SeasonFanartURLs(), SeasonFanartNrs() as String If TVDBArt <> Nil And TVDBArt.IsArray Then For i as Integer = 0 to TVDBArt.Count - 1 Dim jItem as New JSONItem jItem = TVDBArt.Child(i) If NOT jItem.HasName("BannerType") Then Continue App.ErrorMessage = Info + "Process TVDB Art / jItem : " + Str( jItem <> Nil ) + " " + Str( i ) + " of " + Str( TVDBArt.Count - 1 ) Select Case jItem.Value("BannerType") case "poster" // Posters App.ErrorMessage = App.ErrorMessage + " * Posters" TVAttr.ART_PosterURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") If FirstPoster = "" And jItem.HasName("Language") And ( jItem.Value("Language") = Lang Or jItem.Value("Language") = "" ) Then FirstPoster = TVCore.GraphicsPath + jItem.Value("BannerPath") End If case "fanart" // Backdrops App.ErrorMessage = App.ErrorMessage + " * Fanarts" TVAttr.ART_FanartURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") TVAttr.ART_FanartThumbURLs.Append TVCore.GraphicsPath + jItem.Value("ThumbnailPath") TVAttr.ART_FanartDimensions.Append jItem.Value("BannerType2") If FirstFanart = "" And jItem.HasName("Language") And ( jItem.Value("Language") = Lang OR jItem.Value("Language") = "" ) Then FirstFanart = TVCore.GraphicsPath + jItem.Value("BannerPath") End If case "season" // Posters OR Banners (season OR seasonwide) App.ErrorMessage = App.ErrorMessage + " * Season" TVAttr.ART_SeasonURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") TVAttr.ART_SeasonNumbers.Append jItem.Value("Season") SeasonLanguage.Append jItem.Value("Language") 'End If If jItem.Value("BannerType2") = "season" Then SeasonPosterURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") SeasonPosterNrs.Append jItem.Value("Season") ElseIf jItem.Value("BannerType2") = "seasonwide" Then SeasonBannerURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") SeasonBannerNrs.Append jItem.Value("Season") End If case "series" // Banners App.ErrorMessage = App.ErrorMessage + " * Banners" TVAttr.ART_BannerURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") If FirstBanner = "" And jItem.HasName("Language") And ( jItem.Value("Language") = Lang OR jItem.Value("Language") = "" ) Then FirstBanner = TVCore.GraphicsPath + jItem.Value("BannerPath") End If End Select Next End If // Fanart.TV Dim LogoHDURLs(), LogoURLs(), ClearArtHDURLs(), ClearArtURLs(), TVThumbURLs(), CharacterArtURLs() as String Dim SeasonThumbURLs(), SeasonThumbNrs() as String If Prefs.boolForKey("FanartTVEnabled") Then App.ErrorMessage = Info + "Process Fanart.TV" // Fanart.TV // :10 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kProcessing + ":", "Fanart.tv " + Loc.kImages + " " + Loc.mTabInfo + "..." ) Else dlgProgress.debug( "Fanart.tv " + Loc.kImages + " " + Loc.mTabInfo + "..." ) App.ErrorMessage = Info + "Process Fanart.TV: Banners" // -- Banner If FanartTVJSON <> Nil And FanartTVJSON.HasName("tvbanner") And FanartTVJSON.Child("tvbanner").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("tvbanner").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("tvbanner").Child(i) TVAttr.ART_BannerURLs.Append jItem.Value("url") Next End If App.ErrorMessage = Info + "Process Fanart.TV: Fanart" // -- Fanart If FanartTVJSON <> Nil And FanartTVJSON.HasName("showbackground") And FanartTVJSON.Child("showbackground").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("showbackground").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("showbackground").Child(i) TVAttr.ART_FanartURLs.Append jItem.Value("url") TVAttr.ART_FanartDimensions.Append "1920x1080" TVAttr.ART_FanartThumbURLs.Append jItem.Value("url") + "/preview" // Season fanart If jItem.Value("season") <> "" Then SeasonFanartURLs.Append jItem.Value("url") SeasonFanartNrs.Append jItem.Value("season") End If Next End If App.ErrorMessage = Info + "Process Fanart.TV: HD ClearArt" // -- HD ClearArt If FanartTVJSON <> Nil And FanartTVJSON.HasName("hdclearart") And FanartTVJSON.Child("hdclearart").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("hdclearart").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("hdclearart").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then ClearArtHDURLs.Append jItem.Value("url") Next If ClearArtHDURLs.Ubound = -1 And FanartTVJSON.Child("hdclearart").Count > 0 Then ClearArtHDURLs.Append( FanartTVJSON.Child("hdclearart").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: ClearArt" // -- ClearArt If FanartTVJSON <> Nil And FanartTVJSON.HasName("clearart") And FanartTVJSON.Child("clearart").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("clearart").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("clearart").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then ClearArtURLs.Append jItem.Value("url") Next If ClearArtURLs.Ubound = -1 And FanartTVJSON.Child("clearart").Count > 0 Then ClearArtURLs.Append( FanartTVJSON.Child("clearart").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: HD Logo" // -- HD Logo If FanartTVJSON <> Nil And FanartTVJSON.HasName("hdtvlogo") And FanartTVJSON.Child("hdtvlogo").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("hdtvlogo").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("hdtvlogo").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then LogoHDURLs.Append jItem.Value("url") Next If LogoHDURLs.Ubound = -1 And FanartTVJSON.Child("hdtvlogo").Count > 0 Then LogoHDURLs.Append( FanartTVJSON.Child("hdtvlogo").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: Logo" // -- Logo If FanartTVJSON <> Nil And FanartTVJSON.HasName("clearlogo") Then For i as Integer = 0 to FanartTVJSON.Child("clearlogo").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("clearlogo").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then LogoURLs.Append jItem.Value("url") Next If LogoURLs.Ubound = -1 And FanartTVJSON.Child("clearlogo").Count > 0 Then LogoURLs.Append( FanartTVJSON.Child("clearlogo").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: Thumb" // -- Thumb If FanartTVJSON <> Nil And FanartTVJSON.HasName("tvthumb") And FanartTVJSON.Child("tvthumb").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("tvthumb").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("tvthumb").Child(i) TVThumbURLs.Append jItem.Value("url") Next If TVThumbURLs.Ubound = -1 And FanartTVJSON.Child("tvthumb").Count > 0 Then TVThumbURLs.Append( FanartTVJSON.Child("tvthumb").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: CharacterArt" // -- CharacterArt If FanartTVJSON <> Nil And FanartTVJSON.HasName("characterart") And FanartTVJSON.Child("characterart").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("characterart").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("characterart").Child(i) CharacterArtURLs.Append jItem.Value("url") Next If CharacterArtURLs.Ubound = -1 And FanartTVJSON.Child("characterart").Count > 0 Then CharacterArtURLs.Append( FanartTVJSON.Child("characterart").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: SeasonThumb" // -- SeasonThumb If FanartTVJSON <> Nil And FanartTVJSON.HasName("seasonthumb") Then For i as Integer = 0 to FanartTVJSON.Child("seasonthumb").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("seasonthumb").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then SeasonThumbURLs.Append jItem.Value("url") SeasonThumbNrs.Append jItem.Value("season") End If Next End If End If // @END Fanart.tv enabled // -- App.ErrorMessage = Info + "Set FirstArt Download list" // Set download list If FirstPoster = "" And TVAttr.ART_PosterURLs.Ubound > -1 Then FirstPoster = TVAttr.ART_PosterURLs(0) If FirstFanart = "" And TVAttr.ART_FanartURLs.Ubound > -1 Then FirstFanart = TVAttr.ART_FanartURLs(0) If FirstBanner = "" And TVAttr.ART_BannerURLs.Ubound > -1 Then FirstBanner = TVAttr.ART_BannerURLs(0) Dim HighestSeason as Integer = -1 For i as Integer = 0 to TVAttr.ART_SeasonNumbers.Ubound If Val( TVAttr.ART_SeasonNumbers(i) ) > HighestSeason Then HighestSeason = Val( TVAttr.ART_SeasonNumbers(i) ) Next App.ErrorMessage = Info + "Match up all available aseasons from local episodes" // Match up all available seasons from local episodes Dim EpisodeFiles() as FolderItem = FindEpisodeFiles( TVAttr.FolderParent ) Dim AllSeasons() as String AllSeasons.Append "-1" // Season-All art For each episode as FolderItem in EpisodeFiles Dim s as String = RegExEpisode( Episode ) If s <> "" Then AllSeasons.Append s.NthField("x",1) Next App.ErrorMessage = Info + "Make sure that there are no duplicates" // Make sure that there are no duplicates. AllSeasons.Sort AllSeasons = RemoveDuplicatesFromArray( AllSeasons ) AllSeasons = RemoveDuplicatesFromArray( AllSeasons ) If False Then ReDim AllSeasons(-1) For i as Integer = -1 to HighestSeason AllSeasons.Append str( i ) Next End If App.ErrorMessage = Info + "Get SeasonArt URLs" // Get season art urls Dim tmpSeasonPosterURLs(), tmpSeasonPosterNrs() as String Dim tmpSeasonFanartURLs(), tmpSeasonFanartNrs() as String Dim tmpSeasonBannerURLs(), tmpSeasonBannerNrs() as String Dim tmpSeasonThumbsURLs(), tmpSeasonThumbsNrs() as String 'For i as Integer = -1 to HighestSeason For each Season as String in AllSeasons Dim i as Integer = Val( Season ) App.ErrorMessage = Info + "Season " + Str( i ) + " Posters" // Order Season Posters For n as Integer = 0 to SeasonPosterNrs.Ubound If Val( SeasonPosterNrs(n) ) = i Then tmpSeasonPosterURLs.Append SeasonPosterURLs(n) tmpSeasonPosterNrs.Append SeasonPosterNrs(n) Exit End If Next App.ErrorMessage = Info + "Season " + Str( i ) + " Fanarts" // Order Season Fanart For n as Integer = 0 to SeasonFanartNrs.Ubound If Val( SeasonFanartNrs(n) ) = i And SeasonFanartNrs(n) <> "all" Then tmpSeasonFanartURLs.Append SeasonFanartURLs(n) tmpSeasonFanartNrs.Append SeasonFanartNrs(n) Exit ElseIf i = -1 And SeasonFanartNrs(n) = "All" Then tmpSeasonFanartURLs.Append SeasonFanartURLs(n) tmpSeasonFanartNrs.Append SeasonFanartNrs(n) Exit End If Next App.ErrorMessage = Info + "Season " + Str( i ) + " Banners" // Order Season Banners For n as Integer = 0 to SeasonBannerNrs.Ubound If Val( SeasonBannerNrs(n) ) = i Then tmpSeasonBannerURLs.Append SeasonBannerURLs(n) tmpSeasonBannerNrs.Append SeasonBannerNrs(n) Exit End If Next App.ErrorMessage = Info + "Season " + Str( i ) + " Thumbs" // Order Season Thumbs For n as Integer = 0 to SeasonThumbNrs.Ubound If Val( SeasonThumbNrs(n) ) = i And SeasonThumbNrs(n) <> "all" Then tmpSeasonThumbsURLs.Append SeasonThumbURLs(n) tmpSeasonThumbsNrs.Append SeasonThumbNrs(n) Exit ElseIf i = -1 And SeasonThumbNrs(n) = "All" Then tmpSeasonThumbsURLs.Append SeasonThumbURLs(n) tmpSeasonThumbsNrs.Append SeasonThumbNrs(n) Exit End If Next Next SeasonPosterURLs = tmpSeasonPosterURLs SeasonPosterNrs = tmpSeasonPosterNrs SeasonFanartURLs = tmpSeasonFanartURLs SeasonFanartNrs = tmpSeasonFanartNrs SeasonBannerURLs = tmpSeasonBannerURLs SeasonBannerNrs = tmpSeasonBannerNrs SeasonThumbURLs = tmpSeasonThumbsURLs SeasonThumbNrs = tmpSeasonThumbsNrs Dim DBID as String = TVAttr.ID_IMDb If DBID = "" Then DBID = TVAttr.ID_TVDB App.ErrorMessage = Info + "Downloading Poster" // :11 Downloading Poster If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kPoster + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kPoster.Lowercase + " " + Loc.kImage.Lowercase + "..." ) Dim PosterName as String = "poster.jpg" If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then PosterName = "Set_" + TVAttr.FolderParent.Name + "_1.jpg" Dim PosterFile as FolderItem = TVAttr.FolderParent.Child( PosterName ) If Prefs.boolForKey("AutoDownloadPoster") And FirstPoster <> "" And ( PosterFile = Nil OR NOT PosterFile.Exists ) Then If Prefs.stringForKey( "PosterSize" ) = "original" Then TVAttr.ART_Poster = URL2Picture( FirstPoster, TVAttr.FolderParent, PosterName ) Else TVAttr.ART_Poster = Nil TVAttr.ART_Poster = Picture.FromData( sckt.Get( FirstPoster, TimeOut ) ) Sckt.Close If TVAttr.ART_Poster <> Nil Then Dim Width as Integer = Val( Prefs.stringForKey( "PosterSize" ).ReplaceAll("w","") ) Dim Height as Integer = TVAttr.ART_Poster.Height * ( Width / TVAttr.ART_Poster.Width ) If ScaleImage( TVAttr.ART_Poster, Width, Height ) <> Nil Then SaveImage( ScaleImage( TVAttr.ART_Poster, Width, Height ), TVAttr.FolderParent.Child( PosterName ), FileTypes.ImageJpeg ) End If End If End If CacheImageSet( TVAttr.ART_Poster, DBID + ".television.poster.jpg" ) App.ErrorMessage = Info + "Downloading Fanart" // :12 Downloading Fanart If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kFanart + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kFanart.Lowercase + " " + Loc.kImage.Lowercase + "..." ) Dim FanartName as String = "fanart.jpg" If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then FanartName = "Set_" + TVAttr.FolderParent.Name + "_1.fanart.jpg" Dim FanartFile as FolderItem = TVAttr.FolderParent.Child( FanartName ) If Prefs.boolForKey("AutoDownloadBackdrop") And FirstFanart <> "" And ( FanartFile = Nil OR NOT FanartFile.Exists ) Then If Prefs.stringForKey( "FanartSize" ) = "original" Then TVAttr.ART_Fanart = URL2Picture( FirstFanart, TVAttr.FolderParent, FanartName ) Else TVAttr.ART_Fanart = Nil TVAttr.ART_Fanart = Picture.FromData( sckt.Get( FirstFanart, TimeOut * 2 ) ) Sckt.Close If TVAttr.ART_Fanart <> Nil Then Dim Width as Integer = Val( Prefs.stringForKey( "FanartSize" ).ReplaceAll("w","") ) Dim Height as Integer = TVAttr.ART_Fanart.Height * ( Width / TVAttr.ART_Fanart.Width ) If ScaleImage( TVAttr.ART_Fanart, Width, Height ) <> Nil Then SaveImage( ScaleImage( TVAttr.ART_Fanart, Width, Height ), TVAttr.FolderParent.Child( FanartName ), FileTypes.ImageJpeg ) End If End If End If CacheImageSet( TVAttr.ART_Fanart, TVAttr.ID_IMDb + ".television.fanart.jpg" ) App.ErrorMessage = Info + "Downloading Banner" // :13 Downloading Banner If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kBanner + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kBanner.Lowercase + " " + Loc.kImage.Lowercase + "..." ) Dim BannerName as String = "banner.jpg" If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then BannerName = "Set_" + TVAttr.FolderParent.Name + "_1.banner.jpg" Dim BannerFile as FolderItem = TVAttr.FolderParent.Child( BannerName ) If Prefs.boolForKey("AutoDownloadBanner") And FirstBanner <> "" And ( BannerFile = Nil OR NOT BannerFile.Exists ) Then URL2Picture( FirstBanner, TVAttr.FolderParent, BannerName ) App.ErrorMessage = Info + "Downloading Logo" // :14 Downloading Logo If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kLogo + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kLogo.Lowercase + " " + Loc.kImage.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadLogo") And NOT TVAttr.FolderParent.Child("logo.png").Exists Then Dim FirstLogo as String If LogoHDURLs <> Nil And LogoHDURLs.Ubound > -1 Then FirstLogo = LogoHDURLs(0) ElseIf LogoURLs <> Nil And LogoURLs.Ubound > -1 Then FirstLogo = LogoURLs(0) End If If FirstLogo <> "" And TVAttr.FolderParent <> Nil And TVAttr.FolderParent.Exists Then URL2Picture( FirstLogo, TVAttr.FolderParent, "logo.png" ) End If App.ErrorMessage = Info + "Downloading ClearArt" // :15 Downloading ClearArt If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kClearArt + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kClearArt.Lowercase + " " + Loc.kImage.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadClearArt") And NOT TVAttr.FolderParent.Child("clearart.png").Exists Then Dim FirstClearArt as String If ClearArtHDURLs.Ubound > -1 Then FirstClearArt = ClearArtHDURLs(0) ElseIf ClearArtURLs.Ubound > -1 Then FirstClearArt = ClearArtURLs(0) End If If FirstClearArt <> "" Then URL2Picture( FirstClearArt, TVAttr.FolderParent, "clearart.png" ) End If App.ErrorMessage = Info + "Downloading Landscape" // :16 Downloading Landscape If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kTVThumb + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kTVThumb.Lowercase + " " + Loc.kImage.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadThumb") And NOT TVAttr.FolderParent.Child("landscape.jpg").Exists And TVThumbURLs.Ubound > -1 Then URL2Picture( TVThumbURLs(0), TVAttr.FolderParent, "landscape.jpg" ) App.ErrorMessage = Info + "Downloading CharacterArt" // :17 Downloading CharacterArt If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kCharacterArt + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kCharacterArt.Lowercase + " " + Loc.kImage.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadCharacterArt") And NOT TVAttr.FolderParent.Child("character.png").Exists And CharacterArtURLs.Ubound > -1 Then URL2Picture( CharacterArtURLs(0), TVAttr.FolderParent, "character.png" ) App.ErrorMessage = Info + "Downloading Season Posters" // :18 Downloading Season Posters If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kSeason + " " + Loc.kPoster + " " + Loc.kImages.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kSeason + " " + Loc.kPoster.Lowercase + " " + Loc.kImages.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadSeasonArt") Then For i as Integer = 0 to SeasonPosterURLs.Ubound dlgProgress.debug( Str(i+1) + Loc.k1of2 + Str( SeasonPosterURLs.Ubound + 1 ) + " " + Loc.kSeason + " " + Loc.kPoster + " " + Loc.kImages.Lowercase ) Dim Parent as FolderItem = TVAttr.FolderParent Dim SeasonPosterFile as FolderItem If SeasonPosterNrs(i) = "0" Then 'If Parent.Child( "Specials" ).Exists Then Parent = Parent.Child( "Specials" ) SeasonPosterFile = Parent.Child( "season-specials-poster.jpg" ) ElseIf SeasonPosterNrs(i) = "-1" Then SeasonPosterFile = Parent.Child( "season-all-poster.jpg" ) Else Dim SeasonDisplay as String = SeasonPosterNrs(i) If SeasonDisplay.Len = 1 Then SeasonDisplay = " 0" + SeasonDisplay Else SeasonDisplay = " " + SeasonDisplay 'If Parent.Child( "Season" + SeasonDisplay ).Exists Then Parent = Parent.Child( "Season" + SeasonDisplay ) SeasonPosterFile = Parent.Child( "season" + Trim( SeasonDisplay ) + "-poster.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonPosterFile = Parent.Child( "season " + SeasonPosterNrs(i) + ".jpg" ) End If // Download If NOT SeasonPosterFile.Exists Then URL2Picture( SeasonPosterURLs(i), Parent, SeasonPosterFile.Name ) Next End If App.ErrorMessage = Info + "Downloading Season Banners" // ## Season Banners If Prefs.boolForKey("AutoDownloadSeasonArt") Then Dim Pic as Picture For i as Integer = 0 to SeasonBannerURLs.Ubound dlgProgress.debug( Str(i+1) + Loc.k1of2 + Str( SeasonBannerURLs.Ubound + 1 ) + " " + Loc.kSeason + " " + Loc.kBanner.Lowercase + " " + Loc.kImages.Lowercase ) Dim Parent as FolderItem = TVAttr.FolderParent Dim SeasonBannerFile as FolderItem If SeasonBannerNrs(i) = "0" Then 'If Parent.Child( "specials" ).Exists Then Parent = Parent.Child( "specials" ) SeasonBannerFile = Parent.Child( "season-specials-banner.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonBannerFile = Parent.Child( "specials.banner.jpg" ) ElseIf SeasonBannerNrs(i) = "-1" OR SeasonBannerNrs(i) = "All"Then SeasonBannerFile = Parent.Child( "season-all-banner.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonBannerFile = Parent.Child( "seasonall.banner.jpg" ) Else Dim SeasonDisplay as String = SeasonBannerNrs(i) If SeasonDisplay.Len = 1 Then SeasonDisplay = " 0" + SeasonDisplay Else SeasonDisplay = " " + SeasonDisplay 'If Parent.Child( "season" + SeasonDisplay ).Exists Then Parent = Parent.Child( "season" + SeasonDisplay ) SeasonBannerFile = Parent.Child( "season" + Trim( SeasonDisplay ) + "-banner.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonBannerFile = Parent.Child( "season " + Str( SeasonBannerNrs(i) ) + ".banner.jpg" ) End If // Download If NOT SeasonBannerFile.Exists Then URL2Picture( SeasonBannerURLs(i), Parent, SeasonBannerFile.Name ) Next End If App.ErrorMessage = Info + "Downloading Season Thumbs" // :20 Downloading Season Thumbs If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kSeason + " " + Loc.kThumb.Lowercase + " " + Loc.kImages.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kSeason + " " + Loc.kThumb.Lowercase + " " + Loc.kImages.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadSeasonArt") Then For i as Integer = 0 to SeasonThumbURLs.Ubound dlgProgress.debug( Str(i+1) + Loc.k1of2 + Str( SeasonThumbURLs.Ubound + 1 ) + " " + Loc.kSeason + " " + Loc.kImages.Lowercase ) Dim Parent as FolderItem = TVAttr.FolderParent Dim SeasonLandscapeFile as FolderItem If SeasonThumbNrs(i) = "0" Then 'If Parent.Child( "specials" ).Exists Then Parent = Parent.Child( "specials" ) SeasonLandscapeFile = Parent.Child("season-specials-landscape.jpg") If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonLandscapeFile = Parent.Child( "specials.landscape.jpg" ) ElseIf SeasonThumbNrs(i) = "-1" OR SeasonThumbNrs(i) = "All" Then SeasonLandscapeFile = Parent.Child( "season-all-landscape.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonLandscapeFile = Parent.Child( "seasonall.landscape.jpg" ) Else Dim SeasonDisplay as String = SeasonThumbNrs(i) If SeasonDisplay.Len = 1 Then SeasonDisplay = " 0" + SeasonDisplay Else SeasonDisplay = " " + SeasonDisplay 'If Parent.Child( "season" + SeasonDisplay ).Exists Then Parent = Parent.Child( "season" + SeasonDisplay ) SeasonLandscapeFile = Parent.Child( "season" + Trim( SeasonDisplay ) + "-landscape.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonLandscapeFile = Parent.Child( "season " + Str( SeasonThumbNrs(i) ) + ".landscape.jpg" ) End If // Download If NOT SeasonLandscapeFile.Exists Then URL2Picture( SeasonThumbURLs(i), Parent, SeasonLandscapeFile.Name ) Next End If App.ErrorMessage = Info + "Downloading Season Fanarts" // :21 Downloading Season Fanarts If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kSeason + " " + Loc.kFanart.Lowercase + " " + Loc.kImages.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kFanart.Lowercase + " " + Loc.kBanner.Lowercase + " " + Loc.kImages.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadSeasonArt") Then 'If NOT CommonCore.MassSearch Then dlgProgress.Reset For i as Integer = 0 to SeasonFanartURLs.Ubound dlgProgress.debug( Str(i+1) + Loc.k1of2 + Str( SeasonFanartURLs.Ubound + 1 ) + " " + Loc.kSeason + " " + Loc.kFanart + " " + Loc.kImages.Lowercase ) Dim Parent as FolderItem = TVAttr.FolderParent Dim SeasonFanartFile as FolderItem If SeasonFanartNrs(i) = "0" Then 'If Parent.Child( "specials" ).Exists Then Parent = Parent.Child( "specials" ) SeasonFanartFile = Parent.Child( "season-specials-fanart.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonFanartFile = Parent.Child( "specials.fanart.jpg" ) ElseIf SeasonFanartNrs(i) = "-1" OR SeasonFanartNrs(i) = "All" Then SeasonFanartFile = Parent.Child( "season-all-fanart.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonFanartFile = Parent.Child( "seasonall.fanart.jpg" ) Else Dim SeasonDisplay as String = SeasonFanartNrs(i) If SeasonDisplay.Len = 1 Then SeasonDisplay = " 0" + SeasonDisplay Else SeasonDisplay = " " + SeasonDisplay 'If Parent.Child( "season" + SeasonDisplay ).Exists Then Parent = Parent.Child( "season" + SeasonDisplay ) SeasonFanartFile = Parent.Child( "season" + Trim( SeasonDisplay ) + "-fanart.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonFanartFile = Parent.Child( "season " + Str( SeasonFanartNrs(i) ) + ".fanart.jpg" ) End If // Download If NOT SeasonFanartFile.Exists Then URL2Picture( SeasonFanartURLs(i), Parent, SeasonFanartFile.Name ) Next End If App.ErrorMessage = Info + "Downloading Extra Fanarts" // :22 Downloading extra fanart If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kExtraFanarts + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kExtraFanarts + "..." ) If Prefs.boolForKey("AutoDownloadExtraFanart") Then For i as Integer = 0 to TVAttr.ART_FanartURLs.Ubound If Prefs.integerForKey( "MaxBackdrops" ) > 0 And i = Prefs.integerForKey( "MaxBackdrops" ) Then Exit Dim Max as Integer = TVAttr.ART_FanartURLs.Ubound + 1 If Prefs.integerForKey( "MaxBackdrops" ) > 0 And Prefs.integerForKey( "MaxBackdrops" ) < Max Then Max = Prefs.integerForKey( "MaxBackdrops" ) dlgProgress.Debug( Str( i+1 ) + Loc.k1of2 + Str( Max ) + " " + Loc.kExtraFanarts + " " + Loc.kImages.Lowercase ) Dim Destination as FolderItem = TVAttr.FolderParent.Child("extrafanart") If Destination <> Nil And NOT Destination.Exists Then Destination.CreateAsFolder Dim Name() as String = TVAttr.ART_FanartURLs(i).Split("/") Dim FileName as String = Name( Name.Ubound ) If Destination.Child( FileName ).Exists Then Continue Dim Width as Integer = Val( Prefs.stringForKey( "FanartSize" ).ReplaceAll( "w", "" ) ) If Width = 0 Then URL2Picture( TVAttr.ART_FanartURLs(i), Destination, FileName ) Else Dim CurFanart as Picture = Picture.FromData( sckt.Get( TVAttr.ART_FanartURLs(i), TimeOut * 2 ) ) Sckt.Close Dim Factor as Double = CurFanart.Height / CurFanart.Width Dim ScaledImage as Picture = ScaleImage( CurFanart, Width, Width * Factor ) SaveImage( ScaledImage, Destination.Child( FileName ), FileTypes.ImageJpeg ) End If Next End If If NOT CommonCore.MassSearch Then dlgProgress.ProgressMax = LastMax dlgProgress.ProgressValue = LastValue End If End Sub #tag EndMethod #tag Method, Flags = &h0 Sub GetShowNFO(ID as String, Update as Boolean = False) #pragma DisableBackgroundTasks #If NOT DebugBuild Then #pragma DisableBoundsChecking '#pragma NilObjectChecking False #pragma StackOverflowChecking False #endif Dim JSONString, TVInfo as String Dim sckt as New TVDBSckt sckt.Yield = True TVInfo = " " + TVAttr.FolderParent.Name + " " + Loc.mTabInfo.Lowercase + "..." // Play undercover spy. Dim rand as New Random Dim IP as String = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) Sckt.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) Sckt.SetRequestHeader( "User-agent", "Mozilla/" + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,3) ) + " (Windows NT " + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,2) ) + "; rv:2.0.1) Gecko/20100101 Firefox/" + Str( rand.InRange(3,5) ) + ".0.1" ) 'Anonymouse( sckt ) // ## Temporary Save Dim PrevTitle, PrevTitleSort, PrevTitleOriginal, PrevGenres(), PrevTagline, PrevTags() as String If Update Then PrevTitle = TVAttr.Title PrevTitleSort = TVAttr.TitleSort PrevTitleOriginal = TVAttr.TitleOriginal PrevTagline = TVAttr.DescriptionTagline PrevGenres = TVAttr.Genres PrevTags = TVAttr.Tags End If // ## Reset properties TVAttr.ClearProperties // ## Reload (some) properties If Update Then TVAttr.Title = PrevTitle TVAttr.TitleSort = PrevTitleSort TVAttr.TitleOriginal = PrevTitleOriginal TVAttr.DescriptionTagline = PrevTagline TVAttr.Genres = PrevGenres TVAttr.Tags = PrevTags End If // ## Reset progress If NOT CommonCore.MassSearch Then dlgProgress.Reset // ## Gather information Dim Lang as String = Prefs.stringForKey("DBLanguage") Dim TimeOut as Integer = Prefs.integerForKey("TimeOut") / 2 If Lang = "gb" Then Lang = "en" // -- Try to get TVDB ID if only IMDb ID is available. // :1 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Alias]" + TVInfo, 1, 30 ) Else dlgProgress.debug( "[TVDB Alias]" + TVInfo ) If ID.Left(2) = "tt" Then ID = IMDb2TVDB( ID ) // -- Get general TVDB Info // :2 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Info]" + TVInfo ) Else dlgProgress.debug( "[TVDB Info]" + TVInfo ) Dim TVDB as New JSONItem If ID.Left(2) <> "tt" Then Dim XMLString as String = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID ), TimeOut ), Encodings.UTF8 ) if XMLString.Contains( "404 Not Found" ) then XMLString = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID, "en" ), TimeOut ), Encodings.UTF8 ) End If 'XMLString = DecodingFromHTMLMBS( XMLString ) sckt.Close 'JSONString = XMLString.XML2JSON 'If JSONString.ValidJSON("TVDB Info") Then TVDB.Load JSONString TVDB = XMLString.XML2JSON If TVDB <> Nil And TVDB.HasName("Data") And TVDB.ToString.InStr( 0, "Series" ) > 0 And TVDB.Child("Data").HasName("Series") Then TVDB = TVDB.Child("Data").Child("Series") 'ProcessEpisodes XMLString XMLString = "" JSONString = "" End If // -- Get Actors info // :3 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Actors]" + TVInfo ) Else dlgProgress.debug( "[TVDB Actors]" + TVInfo ) Dim TVDBActors as New JSONItem If ID.Left(2) <> "tt" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "Actors", ID ), TimeOut ), Encodings.UTF8 ) sckt.Close 'JSONString = JSONString.XML2JSON 'If JSONString.ValidJSON("TVDB Actors") Then TVDBActors.Load JSONString TVDBActors = JSONString.XML2JSON If TVDBActors <> Nil And TVDBActors.HasName("Actors") And TVDBActors.ToString.InStr( 0, """Actor""") > 0 Then TVDBActors = TVDBActors.Child("Actors") 'and TVDBActors.Child("Actors").HasName("Actor") And TVDBActors.Child("Actors").Child("Actor").IsArray Then TVDBActors = TVDBActors.Child("Actors") JSONString = "" End If // -- Get TVDB Art // :4 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Art]" + TVInfo ) Else dlgProgress.debug( "[TVDB Art]" + TVInfo ) Dim TVDBArt as New JSONItem If ID.Left(2) <> "tt" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "Art", ID ), TimeOut ), Encodings.UTF8 ) sckt.Close 'JSONString = JSONString.XML2JSON 'If JSONString.ValidJSON( "TVDB Art" ) Then TVDBArt.Load JSONString TVDBArt = JSONString.XML2JSON 'If TVDBArt.HasName("Banners") And TVDBArt.ToString.InStr("\""Banner\""") > 0 Then TVDBArt = TVDBArt.Child("Banners") 'And TVDBArt.Child("Banners").HasName("Banner") And TVDBArt.Child("Banners").Child("Banner").IsArray Then TVDBArt = TVDBArt.Child("Banners") If TVDBArt <> Nil And TVDBArt.HasName("Banners") And TVDBArt.ToString.InStr("""Banner""") > 0 And TVDBArt.Child("Banners").HasName("Banner") Then TVDBArt = TVDBArt.Child("Banners").Child("Banner") JSONString = "" End If // -- Get IMDb Info // :5 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[IMDb]" + TVInfo ) Else dlgProgress.debug( "[IMDb]" + TVInfo ) Dim IMDbID as String = ID If IMDbID.Left(2) <> "tt" Then IMDbID = "" If TVDB <> Nil And TVDB.HasName("IMDB_ID") And TVDB.Value("IMDB_ID") <> "" Then IMDbID = TVDB.Value("IMDB_ID") End If Dim IMDb as New JSONItem If IMDbID.Left(2) = "tt" Then IMDb = GetIMDbJSON( IMDbID ) // -- Get FanartTV Info // :6 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[Fanart.TV Art]" + TVInfo ) Else dlgProgress.debug( "[Fanart.TV]" + TVInfo ) JSONString = Trim( DefineEncoding( sckt.Get( URLCore.FanartTV( ID ), TimeOut ), Encodings.UTF8 ) ) 'Dim FirstBracketLoc as Integer = JSONString.InStr(2, "{" ) 'JSONString = Trim( JSONString.Right( JSONString.Len - FirstBracketLoc + 1) ) Dim FanartTVJSON as New JSONItem If JSONString.ValidJSON("Fanart.TV") Then FanartTVJSON.Load JSONString JSONString = "" // -- TVRage // :7 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVRage]" + TVInfo ) Else dlgProgress.debug( "[TVRage]" + TVInfo ) Dim Title as String if IMDb <> nil and IMDb.HasName("ORIGINAL_TITLE") then Title = IMDb.Value("ORIGINAL_TITLE") If title = "" and TVDB <> Nil And TVDB.HasName("SeriesName") Then Title = TVDB.Value("SeriesName") If Title = "" And IMDb.HasName("TITLE") Then Title = IMDb.Value("TITLE") dim year as String if IMDb <> Nil and IMDb.HasName("YEAR") then year = IMDb.Value("YEAR") if Title <> "" then ShowStatus( Title, ID ) end if // -- TV Tunes // :8 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVTunes]" + TVInfo ) Else dlgProgress.debug( "[TVTunes]" + TVInfo ) If Prefs.boolForKey("AutoDownloadThemesong") And Title <> "" Then GetThemeSong( Title ) // ## ---------- Process Information ---------- ## // :8 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kProcessing + ":", Trim( TVInfo ) ) Else dlgProgress.debug( Loc.kProcessing + TVInfo ) // ## IDs TVAttr.ID_TVDB = ID TVAttr.ID_IMDb = IMDbID 'TVAttr.ID_TVRage = TVRageID If TVDB <> Nil And TVDB.HasName("IMDB_ID") And TVDB.Value("IMDB_ID") <> "" Then TVAttr.ID_IMDb = TVDB.Value("IMDB_ID") ElseIf IMDb <> Nil And IMDb.HasName("TITLE_ID") And IMDb.Value("TITLE_ID") <> "" Then TVAttr.ID_IMDb = IMDb.Value("TITLE_ID") End If If TVDB <> Nil And TVDB <> Nil And TVDB.HasName("id") And TVDB.Value("id") <> "" Then TVAttr.ID_TVDB = TVDB.Value("id") 'If TVRage <> Nil And TVRage.HasName("showid") And TVRage.Value("showid") <> "" Then TVAttr.ID_TVRage = TVRage.Value("showid") // ## Title If Update Then TVAttr.Title = PrevTitle 'If TVAttr.Title = "" And IMDb.HasName("USA_TITLE") And Lang = "en" Then TVAttr.Title = IMDb.Value("USA_TITLE") If TVAttr.Title = "" And IMDb <> Nil And IMDb.HasName("TITLE") And Lang <> "en" Then TVAttr.Title = IMDb.Value("TITLE") If TVAttr.Title = "" And TVDB <> Nil And TVDB.HasName("SeriesName") Then TVAttr.Title = TVDB.Value("SeriesName") TVAttr.Title = ReplaceAll( TVAttr.Title, "&", "&" ) // ## Title Original If Update Then TVAttr.TitleOriginal = PrevTitleOriginal If TVAttr.TitleOriginal = "" And IMDb <> Nil And IMDb.HasName("ORIGINAL_TITLE") And IMDb.Value("ORIGINAL_TITLE") <> "" Then TVAttr.TitleOriginal = IMDb.Value("ORIGINAL_TITLE") If TVAttr.TitleOriginal = "" And IMDb <> Nil And IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then TVAttr.TitleOriginal = IMDb.Value("TITLE") If TVAttr.TitleOriginal = "" And TVAttr.Title <> "" Then TVAttr.TitleOriginal = TVAttr.Title If TVAttr.TitleOriginal <> "" And TVAttr.Title = "" Then TVAttr.Title = TVAttr.TitleOriginal TVAttr.TitleOriginal = ReplaceAll( TVAttr.TitleOriginal, "&", "&" ) // ## Sort Title If PrevTitleSort = "" Then TVAttr.TitleSort = Articulator( TVAttr.Title ) Else TVAttr.TitleSort = PrevTitleSort // ## Tagline If IMDb <> Nil and IMDb.HasName("TAGLINE") And IMDb <> Nil And IMDb.Value("TAGLINE") <> "" Then TVAttr.DescriptionTagline = IMDb.Value("TAGLINE") TVAttr.DescriptionTagline = Trim( RegExThis( TVAttr.DescriptionTagline, "\(Season.*\)|\(Series.*\)", "" ) ) If TVAttr.DescriptionTagline <> "" Then TVAttr.DescriptionTaglines.Append TVAttr.DescriptionTagline TVAttr.DescriptionTagline = ReplaceAll( TVAttr.DescriptionTagline, "&", "&" ) // Extra Taglines If IMDb <> Nil And IMDb.HasName("TAGLINES") Then For i as Integer = 0 to IMDb.Child("TAGLINES").Count - 1 TVAttr.DescriptionTaglines.Append Trim( RegExThis( IMDb.Child("TAGLINES").Value(i), "\(Season.*\)|\(Series.*\)", "" ) ) Next TVAttr.DescriptionTaglines = RemoveDuplicatesFromArray( TVAttr.DescriptionTaglines ) If TVAttr.DescriptionTagline = "" And TVAttr.DescriptionTaglines.Ubound > -1 Then TVAttr.DescriptionTagline = TVAttr.DescriptionTaglines(0) End If // ## Plot If TVDB <> Nil And TVDB.HasName("Overview") And TVDB.Value("Overview") <> "" Then TVAttr.DescriptionPlot = DecodingFromHTMLMBS( TVDB.Value("Overview") ) // Partial storyline If ( Lang = "en" OR Lang = "gb" OR TVAttr.DescriptionPlot = "" ) And IMDb <> Nil And IMDb.HasName("STORYLINE") And IMDb.Value("STORYLINE") <> "" And IMDb.Value("STORYLINE").Len > TVAttr.DescriptionPlot.Len Then TVAttr.DescriptionPlot = IMDb.Value("STORYLINE") End If // Full Storyline If ( Lang = "en" OR Lang = "gb" OR TVAttr.DescriptionPlot = "" ) And IMDb <> Nil And IMDb.HasName("STORYLINES") And IMDb.Child("STORYLINES").Count > 0 Then Dim Plot as String = IMDb.Child("STORYLINES").Value( IMDb.Child("STORYLINES").Count -1 ) If Plot.InStr( 0, EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX ) > 0 Then Dim sx1 as Integer = Plot.InStr( 0, EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX ) Plot = Plot.Left( sx1 ) 'If Len( Plot ) > Len( TVAttr.DescriptionPlot ) Then TVAttr.DescriptionPlot = TVAttr.DescriptionPlot.Left( sx1 ) End If End If // ## Outline If IMDb <> Nil And IMDb.HasName("PLOT") And IMDb.Value("PLOT") <> "" Then TVAttr.DescriptionOutline = DecodingFromHTMLMBS( IMDb.Value("PLOT") ) If ( TVAttr.DescriptionPlot = "" And TVAttr.DescriptionPlot <> "" ) OR ( Lang <> "en" And Lang <> "gb" And TVAttr.DescriptionPlot <> "" ) Then Dim sx1 as Integer = TVAttr.DescriptionPlot.InStr( 0, "." ) + 1 If sx1 > 0 Then TVAttr.DescriptionOutline = TVAttr.DescriptionPlot.Left( sx1 ) End If // ## Premieré If TVDB <> Nil And TVDB.HasName("FirstAired") And TVDB.Value("FirstAired") <> "" Then TVAttr.DatePremiered = TVDB.Value("FirstAired") // Date If Val( TVAttr.DatePremiered.left(4) ) > 1000 Then TVAttr.DateYear = Val( TVAttr.DatePremiered.Left(4) ) // Year if TVAttr.DateYear = -1 and IMDb.HasName("YEAR") then TVAttr.DateYear = IMDb.Value("YEAR") // ## MPAA 'If TVDB.HasName("ContentRating") And TVDB.Value("ContentRating") <> "" Then TVAttr.RatingMPAA = TVDB.Value("ContentRating") 'If IMDb.HasName("MPAA_RATING") And Trim( IMDb.Value("MPAA_RATING") ) <> "" Then TVAttr.RatingMPAA = IMDb.Value("MPAA_RATING") If IMDb <> Nil And IMDb.HasName("CERTIFICATIONS") Then For i as Integer = 0 to IMDb.Child("CERTIFICATIONS").Count -1 TVAttr.RatingCertification.Append IMDb.Child("CERTIFICATIONS").Value(i) Next End If TVAttr.RatingCertification = RemoveDuplicatesFromArray( TVAttr.RatingCertification ) Dim USAMPAA as String For i as Integer = 0 to TVAttr.RatingCertification.Ubound If USAMPAA = "" And FlagCountry( TVAttr.RatingCertification(i).NthField(":", 1) ) = "en" Then USAMPAA = TVAttr.RatingCertification(i).NthField( ":", 2 ) If FlagCountry( TVAttr.RatingCertification(i).NthField(":", 1) ) = Prefs.stringForKey("DBLanguage") Then TVAttr.RatingMPAA = TVAttr.RatingCertification(i).NthField(":", 2) 'If TVAttr.ART_MPAARating <> Nil Then Exit End If Next If TVAttr.RatingMPAA = "" Then TVAttr.RatingMPAA = USAMPAA If Trim( TVAttr.RatingMPAA ) = "" And TVDB <> Nil And TVDB.HasName("ContentRating") Then TVAttr.RatingMPAA = TVDB.Value("ContentRating") // ## Rating If TVDB <> Nil And TVDB.HasName("Rating") And TVDB.Value("Rating") <> "" Then TVAttr.Rating = Val( TVDB.Value("Rating") ) If TVDB <> Nil And TVDB.HasName("RatingCount") And TVDB.Value("RatingCount") <> "" Then TVAttr.RatingVotes = Val( TVDB.Value("RatingCount") ) If IMDb <> Nil And IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then TVAttr.Rating = Val( IMDb.Value("RATING") ) If IMDb <> Nil And IMDb.HasName("VOTES") And IMDb.Value("VOTES") <> "" Then TVAttr.RatingVotes = Val( IMDb.Value("VOTES").ReplaceAll(",","") ) // ## Genres ReDim TVAttr.Genres(-1) TVAttr.Genres = PrevGenres Dim tmpArray() as String // TVDB If TVDB <> Nil And TVDB.HasName("Genre") Then tmpArray = Split( TVDB.Value("Genre").ReplaceAll("Science-Fiction","Science Fiction").ReplaceAll(" and ", " & "), "|" ) // IMDB If ( Lang = "en" or Lang = "gb" ) And IMDb <> Nil And IMDb.HasName("GENRES") Then Dim Arry() as String = JSONArray( IMDb.Child("GENRES") ) For i as Integer = 0 to Arry.Ubound tmpArray.Append Arry(i).ReplaceAll("Sci-Fi", "Science Fiction").ReplaceAll(" and ", " & ") Next End If // Remove empties, and add to genres For i as Integer = 0 to tmpArray.Ubound If Trim( tmpArray(i) ) <> "" Then TVAttr.Genres.Append tmpArray(i) Next TVAttr.Genres = RemoveDuplicatesFromArray( TVAttr.Genres ) // Apparantly, boxee only supports uppercase genres? If Prefs.stringForKey("MediaPlayer") = "Boxee" Then For i as Integer = 0 to TVAttr.Genres.Ubound TVAttr.Genres(i) = TVAttr.Genres(i).Uppercase Next End If // ## Studios If TVDB <> Nil And TVDB.HasName("Network") And TVDB.Value("Network") <> "" Then TVAttr.TVNetwork = TVDB.Value("Network") If IMDb <> Nil And IMDb.HasName("STUDIOS") Then For i as Integer = 0 to IMDb.Child("STUDIOS").Count - 1 TVAttr.Studios.Append IMDb.Child("STUDIOS").Value(i) Next End If // ## Country If IMDb <> Nil And IMDb.HasName("COUNTRY") Then For i as Integer = 0 to IMDb.Child("COUNTRY").Count - 1 TVAttr.Countries.Append IMDb.Child("COUNTRY").Value(i) Next End If TVAttr.Countries = RemoveDuplicatesFromArray( TVAttr.Countries ) // ## Language If IMDb <> Nil And IMDb.HasName("LANGUAGE") Then For i as Integer = 0 to IMDb.Child("LANGUAGE").Count - 1 TVAttr.Languages.Append IMDb.Child("LANGUAGE").Value(i) Next End If // ## Recommendations If Prefs.stringForKey("MediaPlayer") <> "YAMJ" And Prefs.boolForKey("GetRecommendations") Then If IMDb <> Nil And IMDb.HasName("RECOMMENDATIONS") And IMDb.Child("RECOMMENDATIONS").IsArray And IMDb.Child("RECOMMENDATIONS").Count > 0 Then For i as Integer = 0 to IMDb.Child("RECOMMENDATIONS").Count - 1 Dim RecTitle as String = Trim( RegExThis( IMDb.Child("RECOMMENDATIONS").Value(i), "\[.*\]", "" ) ) Dim RecID as String = Trim( RegExThis( IMDb.Child("RECOMMENDATIONS").Value(i), ".*\[", "" ) ).ReplaceAll("]","") If RecTitle = "" Then RecTitle = Loc.kNotAvailable TVAttr.RecShows.Append RecTitle TVAttr.RecShow_IDs.Append RecID Next End If End If // ## Director(s) If IMDb <> Nil And IMDb.HasName("DIRECTORS") Then For i as Integer = 0 to IMDb.Child("DIRECTORS").Count - 1 If TVAttr.CreditDirector = "" Then TVAttr.CreditDirector = IMDb.Child("DIRECTORS").Value(i) Else TVAttr.CreditDirector = TVAttr.CreditDirector + ", " + IMDb.Child("DIRECTORS").Value(i) End If Next End If // ## Writer(s) If IMDb <> Nil And IMDb.HasName("WRITERS") Then For i as Integer = 0 to IMDb.Child("WRITERS").Count - 1 If TVAttr.CreditWriter = "" Then TVAttr.CreditWriter = IMDb.Child("WRITERS").Value(i) Else TVAttr.CreditWriter = TVAttr.CreditWriter + ", " + IMDb.Child("WRITERS").Value(i) End If Next End If // ## Actors Starring If IMDb <> Nil And IMDb.HasName("STARS") Then For i as Integer = 0 to IMDb.Child("STARS").Count - 1 TVAttr.ActorStars.Append IMDb.Child("STARS").Value(i) Next End If // ## Actors // -- Prefer IMDb over TVDB If IMDb <> Nil And IMDb.HasName("CAST") And IMDb.HasName("ROLES") ANd IMDb.HasName("CASTTHUMBS") Then For i as Integer = 0 to IMDb.Child("CAST").Count -1 // If only one item, arrayify it. If TVDBActors <> Nil And TVDBActors.HasName("Actor") And NOT TVDBActors.Child("Actor").IsArray Then Dim jItem as New JSONItem jItem = TVDBActors.Child("Actor") TVDBActors.Value("Actor") = New JSONItem TVDBActors.Child("Actor").Value(0) = jItem End If // Match names with TVDB ID's If TVDBActors <> Nil And TVDBActors.HasName("Actor") Then Dim b as Boolean = False For n as Integer = 0 to TVDBActors.Child("Actor").Count -1 If TVDBActors.Child("Actor").Child(n).Value("Name") = IMDb.Child("CAST").Value(i) Then TVAttr.Actor_ID.Append TVDBActors.Child("Actor").Child(n).Value("id") b = True Exit End If Next If NOT b Then TVAttr.Actor_ID.Append "" Else TVAttr.Actor_ID.Append "" End If TVAttr.Actor_Name.Append trim( IMDb.Child("CAST").Value(i) ) TVAttr.Actor_Role.Append Trim( IMDb.Child("ROLES").Value(i) ) TVAttr.Actor_ThumbURL.Append IMDb.Child("CASTTHUMBS").Value(i) Next ElseIf TVDBActors <> Nil And TVDBActors.HasName("Actor") And TVDBActors.Child("Actor").IsArray Then For i as Integer = 0 To TVDBActors.Child("Actor").Count - 1 Dim jItem as New JSONItem jItem = TVDBActors.Child("Actor").Child(i) If jItem.HasName("id") Then TVAttr.Actor_ID.Append jItem.Value("id") Else TVAttr.Actor_ID.Append "" If jItem.HasName("Name") Then TVAttr.Actor_Name.Append jItem.Value("Name") Else TVAttr.Actor_Name.Append "" If jItem.HasName("Role") Then TVAttr.Actor_Role.Append jItem.Value("Role") Else TVAttr.Actor_Role.Append "" If jItem.HasName("Image") And jItem.Value("Image") <> "" Then TVAttr.Actor_ThumbURL.Append TVCore.GraphicsPath + jItem.Value("Image") Else TVAttr.Actor_ThumbURL.Append "" Next End If // Write NFO TVAttr.NFOWrite( TVAttr.FolderParent ) // 18: Get Episode Info TVCore.EpisodeUpdate( TVAttr.ID_TVDB ) // 19: Auto Manage TV Shows Folder If NOT CommonCore.MassSearch And Prefs.boolForKey("AutoManageMedia") Then SingleRenamer( TVAttr.FolderParent, -1, True ) // 20: Download ExtraArt GetArt( TVDBArt, FanartTVJSON ) // 20: Write NFO file. If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kMetadata + ":", Loc.kWritingNFO ) Else dlgProgress.debug( Loc.kWritingNFO ) TVAttr.NFOWrite( TVAttr.FolderParent ) // Copy file to "folder.jpg". Dim FolderIMG as FolderItem Select Case Prefs.stringForKey( "FolderJPGForFileTV" ) Case Loc.kPoster FolderIMG = TVAttr.FolderParent.Child("poster.jpg") Case Loc.kBanner FolderIMG = TVAttr.FolderParent.Child("banner.jpg") Case Loc.kLogo FolderIMG = TVAttr.FolderParent.Child("logo.png") Case Loc.kClearArt FolderIMG = TVAttr.FolderParent.Child("clearart.png") Case Loc.kCharacterArt FolderIMG = TVAttr.FolderParent.Child("character.png") Case Loc.kThumb FolderIMG = TVAttr.FolderParent.Child("landscape.jpg") End Select If FolderIMG <> Nil And FolderIMG.Exists Then FolderIMG.CopyFileTo( TVAttr.FolderParent.Child( "folder" + "." + FolderIMG.Extension ) ) // Download actor images. If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kActorThumbs + "..." ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kActorThumbs + "..." ) If Prefs.boolForKey("AutoDownloadActorThumbs") Then If NOT TVAttr.FolderParent.Child(".actors").Exists Then TVAttr.FolderParent.Child(".actors").CreateAsFolder If SymLink( TVAttr.FolderParent.Child( ".actors" ), TVAttr.FolderParent.Child( "actors" ) ) Then // Created symlink End If Dim ActorFolder as FolderItem = TVAttr.FolderParent.Child(".actors") If ActorFolder = Nil OR NOT ActorFolder.Exists Then ActorFolder = TVAttr.FolderParent.Child("actors") Dim Max as Integer = TVAttr.Actor_ThumbURL.Ubound If Prefs.integerForKey( "MaxActors" ) > 0 And Prefs.integerForKey("MaxActors") <= Max Then Max = Prefs.integerForKey("MaxActors") If ActorFolder <> Nil And ActorFolder.Exists Then For i as Integer = 0 to Max Dim ActorFile as FolderItem = ActorFolder.Child( TVAttr.Actor_Name(i).ReplaceAll(":", "_").ReplaceAll(" ", "_") + ".jpg" ) If TVAttr.Actor_ThumbURL(i) <> "" And TVAttr.Actor_Name(i) <> "" And NOT ActorFile.Exists Then dlgProgress.Debug( Loc.kDownloading + " " + Str( i + 1 ) + Loc.k1of2 + Str( Max + 1 ) + " " + TVAttr.Actor_Name(i) + " " + Loc.kThumb.Lowercase + "..." ) dim data as string = sckt.Get( TVAttr.Actor_ThumbURL(i), TimeOut ) if data.Contains("

ERROR

") then 'Break elseif data <> "" then If Sckt.Get( TVAttr.Actor_ThumbURL(i), ActorFile, TimeOut ) Then TVAttr.Actor_ThumbURL(i) = ActorFile.ShellPath.ReplaceAll( "\", "" ) Else Sckt.Close If ActorFile IsA FolderItem Then ActorFile.Delete End If Sckt.Close end if // @END data.Contains("

ERROR

") ElseIf ActorFile.Exists Then TVAttr.Actor_ThumbURL(i) = ActorFile.ShellPath.ReplaceAll( "\", "" ) End If Next End If dlgProgress.Debug "" End If TVAttr.NFOWrite( TVAttr.FolderParent ) dlgProgress.Debug( "" ) Return End Sub #tag EndMethod #tag Method, Flags = &h0 Function IMDb2TVDB(IMDbID as String) As String Dim Sckt as New TVDBSckt If IMDbID.Left(2) = "tt" Then Dim XMLString as String = DefineEncoding( sckt.Get( TVCore.URL( "InfoAlias", IMDbID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'JSONString = JSONString.XML2JSON Dim TVDBAlias as New JSONItem 'If JSONString.ValidJSON("TVDB Alias") Then TVDBAlias.Load JSONString TVDBAlias = XMLString.XML2JSON If TVDBAlias = Nil Then Return "" If TVDBAlias.HasName("Data") And TVDBAlias.ToString.InStr( 0, "Series" ) > 0 And TVDBAlias.Child("Data").HasName("Series") And TVDBAlias.Child("Data").Child("Series").HasName("id") Then Return TVDBAlias.Child("Data").Child("Series").Value("id") Else Return IMDbID End If Else Return IMDbID End If End Function #tag EndMethod #tag Method, Flags = &h0 Function ProcessEpGuide(XMLString as String, SeriesID as String) As JSONItem Dim Info as String = "ProcessEpGuide( XMLString, " + SeriesID + " ) - " App.ErrorMessage = Info + XMLString If XMLString.InStr( 0, " 0 Then Return Nil App.ErrorMessage = Info + "Create destination" XMLString = XMLString.ReplaceAll( XMLString.MyMid( "", "" ), "" ).ReplaceAll( "", "" ) Dim Destination as FolderItem = Preferences.fAppSupport.Child( "EpisodeGuides" ) If Destination <> Nil And NOT Destination.Exists Then Destination.CreateAsFolder 'Dim JSONString as String = XMLString.XML2JSON If Destination <> Nil Then If Destination.Child( SeriesID + ".json" ).Exists Then Destination.Child( SeriesID + ".json" ).MoveFileTo( TVAttr.FolderParent.Child( "EpisodeGuide.json" ) ) Else Return Nil End If Destination = TVAttr.FolderParent App.ErrorMessage = Info + "Load the old guide" // ## Load the old guide. dlgProgress.Debug ( Loc.kReadingInfo + ": " + Loc.kEpisodeGuide.Lowercase ) Dim OldGuide as New JSONItem Dim JSONString as String = ReadTextFile( Destination.Child( "EpisodeGuide.json" ) ) If JSONString <> "" Then OldGuide.Load( JSONString ) If OldGuide <> Nil And OldGuide.HasName("episodes") Then OldGuide = OldGuide.Child("episodes") If OldGuide <> Nil And NOT OldGuide.IsArray Then App.ErrorMessage = Info + "Turn the old guide into an array" Dim Daddy as New JSONItem Daddy.Child(0) = OldGuide OldGuide = Daddy End If App.ErrorMessage = Info + "Set the new guide" // ## Set the New Guide. Dim NewGuide as New JSONItem 'NewGuide.Load( XMLString.ReplaceAll("\","").XML2JSON ) If XMLString <> "" Then NewGuide = XMLString.XML2JSON If NewGuide = Nil OR Len( NewGuide.ToString ) < 100 Then Return Nil If NewGuide <> Nil And NewGuide.HasName("Data") And NewGuide.ToString.InStr( 0, """Episode""" ) > 0 And NewGuide.Child("Data").HasName("Episode") Then NewGuide = NewGuide.Child("Data").Child("Episode") // If only a single episode was available, re-convert guide to Array. If NOT NewGuide.IsArray Then App.ErrorMessage = Info + "Turn new guide into array" Dim Daddy as New JSONItem Daddy.Child(0) = NewGuide NewGuide = Daddy End If App.ErrorMessage = Info + "Create Update-Guide" Dim UpdatedGuide as New JSONItem UpdatedGuide.Value( "episodes" ) = New JSONItem If NOT CommonCore.MassSearch Then dlgProgress.Reset For i as Integer = 0 to NewGuide.Count -1 App.ErrorMessage = Info + "UpdateGuide JSONItem( " + Str( i ) + " of " + Str( NewGuide.Count -1 ) + " )" dlgProgress.Debug( Loc.kProcessing + " " + Str( i + 1 ) + Loc.k1of2 + Str( NewGuide.Count ) + " " + Loc.kEpisodes.Lowercase ) Dim OldEpisodeData as New JSONItem, NewEpisodeData as New JSONItem, UpdateEpisodeData as New JSONItem NewEpisodeData = NewGuide.Child(i) // Match OldEpisde to New Episode If NewEpisodeData.HasName("SeasonNumber") And NewEpisodeData.HasName("EpisodeNumber") Then For n as Integer = 0 to OldGuide.Count -1 OldEpisodeData = OldGuide.Child(n) If OldEpisodeData.HasName("SeasonNumber") And OldEpisodeData.Value("SeasonNumber") = NewEpisodeData.Value("SeasonNumber") And _ OldEpisodeData.HasName("EpisodeNumber") And OldEpisodeData.Value("EpisodeNumber") = NewEpisodeData.Value("EpisodeNumber") Then Exit End If OldEpisodeData = Nil Next 'If OldEpisodeData = Nil Then OldEpisodeData.Load( "" ) End If Dim dSeason, dEpisode as String If NewEpisodeData.HasName("SeasonNumber") Then dSeason = NewEpisodeData.Value("SeasonNumber") If NewEpisodeData.HasName("EpisodeNumber") Then dEpisode = NewEpisodeData.Value("EpisodeNumber") If dSeason.len = 1 Then dSeason = "0" + dSeason If dEpisode.len = 1 Then dEpisode = "0" + dEpisode If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kEpisodeGuide + ":", "S" + dSeason + "E" + dEpisode + " - " + ReplaceAll( NewEpisodeData.Value("EpisodeName"), "&", "&" ), 1, NewGuide.Count ) Else dlgProgress.Debug( Loc.kEpisodeGuide + ": " + "S" + dSeason + "E" + dEpisode + " - " + ReplaceAll( NewEpisodeData.Value("EpisodeName"), "&", "&" ) ) End If UpdateEpisodeData.Value("id") = NewEpisodeData.Value("id") UpdateEpisodeData.Value("IMDB_ID") = NewEpisodeData.Value("IMDB_ID") UpdateEpisodeData.Value("seasonid") = NewEpisodeData.Value("seasonid") UpdateEpisodeData.Value("EpisodeName") = ReplaceAll( NewEpisodeData.Value("EpisodeName"), "&", "&" ) UpdateEpisodeData.Value("SeasonNumber") = NewEpisodeData.Value("SeasonNumber") UpdateEpisodeData.Value("EpisodeNumber") = NewEpisodeData.Value("EpisodeNumber") UpdateEpisodeData.Value("DVDSeason") = NewEpisodeData.Value("DVD_season") UpdateEpisodeData.Value("DVDEpisode") = NewEpisodeData.Value("DVD_episodenumber") UpdateEpisodeData.Value("AbsoluteNumber") = NewEpisodeData.Value("absolute_number") // Get episode IMDB data if possible, and episode hasn't been watched yet. Dim IMDbEpisode as New JSONItem If UpdateEpisodeData.Value("IMDB_ID") <> "" Then If ( OldEpisodeData <> Nil And OldEpisodeData.HasName("IMDB_ID") And OldEpisodeData.Value("IMDB_ID") = "" ) OR _ UpdateEpisodeData.HasName("Runtime") And UpdateEpisodeData.Value("Runtime") = True OR _ OldEpisodeData = Nil OR _ ( OldEpisodeData <> Nil And OldEpisodeData.HasName("Cast") And OldEpisodeData.Child("Cast").Count = 0 ) OR _ ( OldEpisodeData <> Nil And OldEpisodeData.HasName("plot") And OldEpisodeData.Value("plot") = "" ) Then 'IMDbEpisode = GetIMDbJSON( UpdateEpisodeData.Value("IMDB_ID"), True ) End If End If // Special deliveries If NewEpisodeData.HasName("airsbefore_season") Then UpdateEpisodeData.Value("airsafter_season") = NewEpisodeData.Value("airsafter_season") 'If NewEpisodeData.Value("airsafter_season") = "" And NewEpisodeData.Value("airsbefore_season") > 0 Then UpdateEpisodeData.Value("airsafter_season") = NewEpisodeData.Value("airsbefore_season") - 1 UpdateEpisodeData.Value("airsbefore_season") = NewEpisodeData.Value("airsbefore_season") 'If NewEpisodeData.Value("airsbefore_season") = "" And NewEpisodeData.Value("airsafter_season") > 0 Then UpdateEpisodeData.Value("airsbefore_season") = NewEpisodeData.Value("airsafter_season") + 1 If NewEpisodeData.HasName("airsbefore_episode") And NewEpisodeData.Value("airsbefore_episode") <> "" Then UpdateEpisodeData.Value("airsbefore_episode") = NewEpisodeData.Value("airsbefore_episode") Else UpdateEpisodeData.Value("airsbefore_episode") = "4096" End If End If If OldEpisodeData <> Nil And OldEpisodeData.HasName("airsafterseason") Then UpdateEpisodeData.Value("airsafterseason") = OldEpisodeData.Value("airsafterseason") UpdateEpisodeData.Value("airsbeforeseason") = OldEpisodeData.Value("airsbeforeseason") UpdateEpisodeData.Value("airsbeforeepisode") = OldEpisodeData.Value("airsbeforeepisode") End If // AirDate UpdateEpisodeData.Value("FirstAired") = NewEpisodeData.Value("FirstAired") // Runtime If OldEpisodeData <> Nil And OldEpisodeData.HasName("Runtime") Then UpdateEpisodeData.Value("Runtime") = OldEpisodeData.Value("Runtime") If IMDbEpisode <> Nil And IMDbEpisode.HasName("RUNTIME") Then UpdateEpisodeData.Value("Runtime") = IMDbEpisode.Value("RUNTIME") // Fix a bug I made If UpdateEpisodeData.HasName("Runtime") And UpdateEpisodeData.Value("Runtime") = True Then UpdateEpisodeData.Remove("Runtime") // Rating UpdateEpisodeData.Value("Rating") = NewEpisodeData.Value("Rating") If OldEpisodeData <> Nil And OldEpisodeData.HasName("Rating") And OldEpisodeData.Value("Rating") <> "" Then UpdateEpisodeData.Value("Rating") = OldEpisodeData.Value("Rating") If IMDbEpisode <> Nil And IMDbEpisode.HasName("RATING") Then UpdateEpisodeData.Value("Rating") = IMDbEpisode.Value("RATING") UpdateEpisodeData.Value("Votes") = NewEpisodeData.Value("RatingCount") If IMDbEpisode <> Nil And IMDbEpisode.HasName("VOTES") Then UpdateEpisodeData.Value("Votes") = IMDbEpisode.Value("VOTES") // Watched status If OldEpisodeData <> Nil And OldEpisodeData.HasName("watched") And OldEpisodeData.Value("watched") <> "" Then UpdateEpisodeData.Value("watched") = OldEpisodeData.Value("watched") Else UpdateEpisodeData.Value("watched") = False End If // Description // -- Outline 'UpdateEpisodeData.Value("outline") = "" 'If IMDbEpisode <> Nil And IMDbEpisode.HasName("PLOT") Then UpdateEpisodeData.Value("outline") = IMDbEpisode.Value("PLOT") // -- Plot UpdateEpisodeData.Value("plot") = "" 'If NewEpisodeData.Child("Overview").IsArray Then MessageBox "Array" If NewEpisodeData.HasName("Overview") And NOT NewEpisodeData.Value("Overview").IsArray Then UpdateEpisodeData.Value("plot") = Trim( NewEpisodeData.Value("Overview") ) If UpdateEpisodeData.Value("plot") = "" And IMDbEpisode <> Nil And IMDbEpisode.HasName("STORYLINE") And Trim( IMDbEpisode.Value("STORYLINE") ) <> "" Then // IMDb Backup UpdateEpisodeData.Value("plot") = Trim( IMDbEpisode.Value("STORYLINE").ReplaceAll("»", "") ) End If 'If IMDbEpisode <> Nil And IMDbEpisode.HasName("STORYLINE") And Trim( IMDbEpisode.Value("STORYLINE") ) <> "" And _ ' IMDbEpisode.Value("STORYLINE").InStr( 0, "»" ) = 0 And _ '( NOT UpdateEpisodeData.HasName("Plot") OR UpdateEpisodeData.Value("Plot") = "" ) Then 'If Trim( IMDbEpisode.Value("STORYLINE").ReplaceAll("»", "") ) <> "" Then UpdateEpisodeData.Value("plot") = Trim( IMDbEpisode.Value("STORYLINE").ReplaceAll("»", "") ) 'End If // Thumb UpdateEpisodeData.Value("filename") = "" If NewEpisodeData.HasName("filename") And NewEpisodeData.Value("filename") <> "" Then UpdateEpisodeData.Value("filename") = TVCore.GraphicsPath + NewEpisodeData.Value("filename") // Doesn't give good results: 'If IMDbEpisode <> Nil And IMDbEpisode.HasName("POSTER_FULL") And IMDbEpisode.Value("POSTER_FULL") <> "" Then 'UpdateEpisodeData.Value("filename") = IMDbEpisode.Value("POSTER_FULL").ReplaceAll("_V1._SY0.", "_V1._SY750.") 'End If UpdateEpisodeData.Value("poster") = "" If IMDbEpisode <> Nil And IMDbEpisode.HasName( "POSTER_LARGE" ) Then UpdateEpisodeData.Value("poster") = IMDbEpisode.Value("POSTER_LARGE") // #Credits // - Directors Dim Directors as String = NewEpisodeData.Value("Director") If Directors.Left(1) = "|" Then Directors = Directors.Right( Directors.Len - 1 ) If Directors.Right(1) = "|" Then Directors = Directors.Left( Directors.Len - 1 ) Directors = Directors.ReplaceAll("|", ", ") UpdateEpisodeData.Value( "director" ) = Trim( Directors ) // - Writers Dim Writers as String = NewEpisodeData.Value("Writer") If Writers.Left(1) = "|" Then Writers = Writers.Right( Writers.Len - 1 ) If Writers.Right(1) = "|" Then Writers = Writers.Left( Writers.Len - 1 ) Writers = Writers.ReplaceAll("|", ", ") UpdateEpisodeData.Value( "credits" ) = Trim( Writers ) // - Guest Stars Dim GuestStars as String = NewEpisodeData.Value("GuestStars") If GuestStars.Left(1) = "|" Then GuestStars = GuestStars.Right( GuestStars.Len - 1 ) If GuestStars.Right(1) = "|" Then GuestStars = GuestStars.Left( GuestStars.Len - 1 ) GuestStars = GuestStars.ReplaceAll("|", ", ") UpdateEpisodeData.Value( "guests" ) = Trim( GuestStars ) // - Actors 'UpdateEpisodeData.Value("Cast") = New JSONItem 'UpdateEpisodeData.Value("Roles") = New JSONItem 'UpdateEpisodeData.Value("CastThumbs") = New JSONItem // Download IMDB data. 'If IMDbEpisode <> Nil And IMDbEpisode.HasName("CAST") Then 'For n as Integer = 0 to IMDbEpisode.Child("CAST").Count -1 'UpdateEpisodeData.Child("Cast").Value(n) = IMDbEpisode.Child("CAST").Value(n) 'UpdateEpisodeData.Child("Roles").Value(n) = IMDbEpisode.Child("ROLES").Value(n) 'UpdateEpisodeData.Child("CastThumbs").Value(n) = IMDbEpisode.Child("CASTTHUMBS").Value(n) 'Next ' 'ElseIf OldEpisodeData <> Nil And OldEpisodeData.HasName("Cast") Then 'UpdateEpisodeData.Child("Cast") = OldEpisodeData.Child("Cast") 'UpdateEpisodeData.Child("Roles") = OldEpisodeData.Child("Roles") 'UpdateEpisodeData.Child("CastThumbs") = OldEpisodeData.Child("CastThumbs") 'Else 'For n as Integer = 0 to TVAttr.Actor_Name.Ubound 'UpdateEpisodeData.Child("Cast").Value(n) = TVAttr.Actor_Name(n) 'UpdateEpisodeData.Child("Roles").Value(n) = TVAttr.Actor_Role(n) 'UpdateEpisodeData.Child("CastThumbs").Value(n) = TVAttr.Actor_ThumbURL(n) 'Next 'End If // Download actor thumbnails 'If Prefs.boolForKey("AutoDownloadActorThumbs") Then 'If NOT TVAttr.FolderParent.Child("actors").Exists Then TVAttr.FolderParent.Child("actors").CreateAsFolder 'For n as Integer = 0 to UpdateEpisodeData.Child("CastThumbs").Count -1 'Dim URL as String = Trim( UpdateEpisodeData.Child("CastThumbs").Value(n) ) 'Dim Name as String = Trim( UpdateEpisodeData.Child("Cast").Value(n) ) ' 'If URL = "" OR URL.Left(4) <> "http" OR Name = "" OR TVAttr.FolderParent.Child("actors").Child( Name + ".jpg" ).Exists Then Continue ' 'Dim sckt as New TVDBSckt 'If sckt.Get( URL, TVAttr.FolderParent.Child("actors").Child( Name + ".jpg" ), Prefs.integerForKey("TimeOut") ) Then 'UpdateEpisodeData.Child("CastThumbs").Value(n) = TVAttr.FolderParent.Child("actors").Child( Name + ".jpg" ).ShellPath.ReplaceAll("\","") 'End If 'sckt.Close ' 'Next 'End If UpdatedGuide.Child("episodes").Append UpdateEpisodeData UpdatedGuide.Compact = False Next dlgProgress.Debug "" 'UpdatedGuide.Compact = True // ## Write EpGuide to Disk. WriteTextFile( UpdatedGuide.ToString, Destination.Child( "EpisodeGuide.json" ) ) If UpdatedGuide.HasName("episodes") Then Return UpdatedGuide.Child("episodes") Else Return UpdatedGuide End If End Function #tag EndMethod #tag Method, Flags = &h0 Sub ProcessEpisodes(XMLString as String) 'If XMLString.InStr( "Website is currently unreachable" ) > 0 Then 'MessageBox MovieCore.kServiceUnavailable + chr(13) + chr(13) + Loc.kPleaseTryAgainLater 'Return 'End If If XMLString.ValidJSON( "TVDB EpGuide", true ) Then Return If XMLString = "" OR XMLString.InStr( "" ) > 0 Then Return App.ErrorMessage = "Let's start!" Dim ID as String = XMLString.MyMid( "", "" ) ID = ID.MyMid( "","" ) Dim SeriesName as String = XMLString.MyMid( "", "" ) Dim EpisodeGuide as New JSONItem If XMLString <> "" And ID <> "" Then EpisodeGuide = ProcessEpGuide( XMLString, ID ) Else Return XMLString = "" 'If Prefs.boolForKey("SkipEpisodeFiles") Then Return // The user has chosen not to manage episode files. Dim EpisodeFiles() as FolderItem = FindEpisodeFiles( TVAttr.FolderParent ) Dim CurrentEpisode as FolderItem If NOT CommonCore.MassSearch Then dlgProgress.Reset If EpisodeFiles = Nil Then Return Dim CurrentItem as FolderItem 'dlgProgress.Reset dlgProgress.Add( Loc.kSearching + ":", Loc.kEpisodeFiles ) For i as Integer = 0 to EpisodeFiles.Ubound App.ErrorMessage = "EpisodeFiles(" + Str( i ) + ") of (" + Str( EpisodeFiles.Ubound ) + ")" 'dlgProgress.Add( Loc.kProcessing + ":", EpisodeFiles(i).NameNoExtension, 1, EpisodeFiles.Ubound ) If EpisodeFiles(i) = Nil OR NOT EpisodeFiles(i).Exists Then Continue CurrentItem = EpisodeFiles(i) Dim Parent as FolderItem = CurrentItem.Parent // Read previous NFO file. Dim NFOFile as FolderItem = Parent.Child( CurrentItem.NameNoExtension + ".nfo" ) // Continue if there's already an .nfo and thumbnail file. Dim ImageFile as FolderItem If ( Parent.Child( CurrentItem.NameNoExtension + ".jpg" ).Exists OR _ Parent.Child( CurrentItem.NameNoExtension + ".tbn" ).Exists OR _ Parent.Child( CurrentItem.NameNoExtension + "-thumb.jpg" ).Exists OR _ Parent.Child( CurrentItem.NameNoExtension + "-videoimage.jpg" ).Exists ) And _ NFOFile <> Nil And NFOFile.Exists Then Continue End If Dim ExistingNFO as New JSONItem If NFOFile <> Nil And NFOFile.Exists Then CurrentEpisode = EpisodeFiles(i) Dim s as String = ReadTextFile( NFOFile ) 'Dim JSONString as String = ReadTextFile( NFOFile ).XML2JSON 'If JSONString <> "" Then ExistingNFO.Load JSONString If Trim( s ).InStr( 0, " 0 Then ExistingNFO = ReadTextFile( NFOFile ).XML2JSON 'If Trim( s ).Contains("","") <> "" Then Continue If ExistingNFO <> Nil And ExistingNFO.HasName("episodedetails") Then ExistingNFO = ExistingNFO.Child("episodedetails") End If // Check the EpisodeGuide and match it with the current episode. Dim OOxOO as String = RegExEpisode( EpisodeFiles(i) ) If OOxOO.InStr( "-" ) > 0 Then Continue // Negative values are no good. Dim SeasonNr, Season as Integer = Val( OOxOO.NthField( "x", 1 ) ) Dim EpisodeNr as Integer = Val( OOxOO.NthField( "x", 2 ) ) // Multi part episodes Dim Episodes() as String = OOxOO.Split("x") Dim MultiEpisode() as JSONItem If Episodes.Ubound >= 2 Then For n as Integer = 1 to Episodes.Ubound App.ErrorMessage = App.ErrorMessage + chr(13) + "MultiEpisodes(" + Str( n ) + ") of (" + Str( Episodes.Ubound ) + ") " + OOxOO 'EpisodeNrs.Append Episodes(i) Dim CurrentEpisodeNr as String = Str( Val( Episodes(n) ) ) Dim EpisodeName as String = Loc.kNotAvailable If EpisodeGuide <> Nil And EpisodeGuide.Count > 0 Then For t as Integer = 0 to EpisodeGuide.Count -1 Dim ThisEpisode as New JSONItem ThisEpisode = EpisodeGuide.Child(t) If ThisEpisode.HasName("SeasonNumber") And Str( ThisEpisode.Value("SeasonNumber") ) = Str( SeasonNr ) Then If ThisEpisode.HasName("EpisodeNumber") And Str( ThisEpisode.Value("EpisodeNumber") ) = CurrentEpisodeNr Then MultiEpisode.Append ThisEpisode If ThisEpisode.HasName("EpisodeName") Then EpisodeName = ReplaceAll( ThisEpisode.Value("EpisodeName"), "&", "&" ) Exit End If End If ThisEpisode = Nil Next End If 'For t as Integer = 0 to EpisodeGuide.Count -1 ''App.ErrorMessage = App.ErrorMessage + chr(13) + "EpisodeGuide(" + Str( t ) + ") of (" + Str( EpisodeGuide.Count - 1 ) + ")" 'Dim ThisEpisode as New JSONItem 'ThisEpisode = EpisodeGuide.Child(t) ' ''If TRUE Then // Absolute order ' 'If ThisEpisode.HasName("SeasonNumber") And Val( ThisEpisode.Value("SeasonNumber") ) = SeasonNr And _ 'ThisEpisode.HasName("EpisodeNumber") And Val( ThisEpisode.Value("EpisodeNumber") ) = Val( EpisodeNrs ) Then 'MultiEpisode.Append ThisEpisode 'If ThisEpisode.HasName("EpisodeName") Then EpisodeName = ThisEpisode.Value("EpisodeName") 'Exit 'End If ' ''Else // DVD order '' ''Dim DVDSeason, DVDEpisode as Integer ''If ThisEpisode.HasName("DVD_season") And ThisEpisode.Value("DVD_season") <> "" Then ''DVDSeason = ThisEpisode.Value("DVD_season") ''ElseIf ThisEpisode.HasName("SeasonNumber") Then ''DVDSeason = ThisEpisode.Value("SeasonNumber") ''End If '' ''If ThisEpisode.HasName("DVD_episodenumber") And ThisEpisode.Value("DVD_episodenumber") <> "" Then ''DVDEpisode = ThisEpisode.Value("DVD_episodenumber") ''ElseIf ThisEpisode.HasName("EpisodeNumber") Then ''DVDEpisode = ThisEpisode.Value("EpisodeNumber") ''End If '' ''If DVDSeason = SeasonNr And DVDEpisode = Val( EpisodeNrs ) Then ''MultiEpisode.Append ThisEpisode ''Exit ''End If '' ''End If ' 'ThisEpisode = Nil 'Next // Display progress information. 'Dim SeasonDisplay as String = Str( SeasonNr ) 'If SeasonDisplay.Len = 1 Then SeasonDisplay = "0" + SeasonDisplay 'Dim EpisodeDisplay as String = Str( Episodes(n) ) 'If EpisodeDisplay.Len = 1 Then EpisodeDisplay = "0" + EpisodeDisplay App.ErrorMessage = App.ErrorMessage + chr(13) + "Show drogress dialog" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kEpisodes + ":", "S" + LeadingZero( SeasonNr ) + "E" + LeadingZero( Val( Episodes(n) ) ) + " - " + EpisodeName, 1, EpisodeGuide.Count ) Else dlgProgress.Debug( "S" + LeadingZero( SeasonNr ) + "E" + LeadingZero( Val( Episodes(n) ) ) + " - " + EpisodeName ) End If Next App.ErrorMessage = "Multi-Episode Fault writing NFO" If MultiEpisode.Ubound > -1 Then EpisodeFiles(i) = TVAttr.EpisodeNFO( Nil, EpisodeFiles(i), MultiEpisode ) End If Else 'If EpisodeNrs.Ubound = 3 If SeasonNr = -1 Then SeasonNr = 1 If ExistingNFO <> Nil And ExistingNFO.HasName("season") And ExistingNFO.Value("season") <> "" Then SeasonNr = ExistingNFO.Value("season") If ExistingNFO <> Nil And ExistingNFO.HasName("episode") And ExistingNFO.Value("episode") <> "" Then EpisodeNr = ExistingNFO.Value("episode") // Match episode to episodeguide NFO. Dim ThisEpisode as New JSONItem If EpisodeGuide = Nil Then Continue For n as Integer = 0 to EpisodeGuide.Count -1 App.ErrorMessage = App.ErrorMessage + chr(13) + "EpisodeGuide(" + Str( n ) + ") of (" + Str( EpisodeGuide.Count - 1 ) + ")" ThisEpisode = EpisodeGuide.Child(n) If ThisEpisode.HasName("SeasonNumber") And Val( ThisEpisode.Value("SeasonNumber") ) = SeasonNr And _ ThisEpisode.HasName("EpisodeNumber") And Val( ThisEpisode.Value("EpisodeNumber") ) = EpisodeNr Then Exit ThisEpisode = Nil Next If ThisEpisode = Nil Then Continue // Display progress information. Dim SeasonDisplay as String = Str( SeasonNr ) 'If SeasonDisplay.Len = 1 Then SeasonDisplay = "0" + SeasonDisplay Dim EpisodeDisplay as String = Str( EpisodeNr ) 'If EpisodeDisplay.Len = 1 Then EpisodeDisplay = "0" + EpisodeDisplay If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kEpisodes + ":", "S" + LeadingZero( SeasonNr ) + "E" + LeadingZero( EpisodeNr ) + " - " + ThisEpisode.Value("EpisodeName"), 1, EpisodeGuide.Count ) Else dlgProgress.Debug( "S" + LeadingZero( SeasonNr ) + "E" + LeadingZero( EpisodeNr ) + " - " + ThisEpisode.Value("EpisodeName") ) End If App.ErrorMessage = "Single-Episode fault writing NFO" EpisodeFiles(i) = TVAttr.EpisodeNFO( ThisEpisode, EpisodeFiles(i) ) End If If MultiEpisode.Ubound <= -1 Then Continue Next dlgProgress.Debug "" App.ErrorMessage = "" Exception err as XmlException Dim w as New wndBugReporter If CurrentEpisode <> Nil Then w.Init( err, CurrentEpisode.Parent.ShellPath.ReplaceAll("\","") + "/" + CurrentEpisode.NameNoExtension + ".nfo" + chr( 13 ) + App.ErrorMessage ) ElseIf CurrentItem <> Nil Then w.Init( err, CurrentItem.Name + chr( 13 ) + App.ErrorMessage) Else w.Init( err, chr( 13 ) + App.ErrorMessage ) End If Return Exception err as OutOfBoundsException Dim w as New wndBugReporter If CurrentEpisode <> Nil Then w.Init( err, CurrentEpisode.Parent.ShellPath.ReplaceAll("\","") + "/" + CurrentEpisode.NameNoExtension + ".nfo" + chr( 13 ) + App.ErrorMessage ) ElseIf CurrentItem <> Nil Then w.Init( err, TVAttr.Title + Chr(13) + CurrentItem.Name + chr( 13 ) + App.ErrorMessage ) ELse w.Init( err, chr( 13 ) + App.ErrorMessage ) End If Return 'MessageBox "Xml Exception ERROR " + Str( err.ErrorNumber ) + EndOfLine _ '+ err.Message + EndOfLine + _ 'EndOfLine + _ 'CurrentEpisode.Parent.ShellPath.ReplaceAll("\","") + "/" + CurrentEpisode.NameNoExtension + ".nfo" 'Return 'Exception err as OutOfBoundsException 'MessageBox " 'Return End Sub #tag EndMethod #tag Note, Name = TVDB Api Docs http://thetvdb.com/wiki/index.php?title=Programmers_API #tag EndNote #tag Constant, Name = MirrorPath, Type = String, Dynamic = False, Default = \"http://thetvdb.com", Scope = Public #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Address" Visible=true Group="Behavior" Type="String" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="defaultPort" Group="Behavior" InitialValue="0" Type="integer" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="httpProxyAddress" Group="Behavior" Type="string" EditorType="MultiLineEditor" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="httpProxyPort" Group="Behavior" InitialValue="0" Type="integer" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="Index" Visible=true Group="ID" Type="Integer" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Port" Visible=true Group="Behavior" InitialValue="0" Type="Integer" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="yield" Group="Behavior" InitialValue="0" Type="boolean" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag EndViewBehavior End Class #tag EndClass \ No newline at end of file +#tag Class Protected Class TVDBSckt Inherits HTTPSocket #tag Event Sub Error(code as integer) If CommonCore.MassSearch Then CommonCore.UnfoundPaths.Append TVAttr.FolderParent CommonCore.UnfoundTitles.Append "HTTP Error: " + str(code) + " occured." End If SocketError( code, Me ) Exception err as NilObjectException Me.Close End Sub #tag EndEvent #tag Method, Flags = &h0 Sub GetArt(TVDBArt as JSONItem, FanartTVJSON as JSONItem) Dim Info as String = "GetArt( TVDBArt : " + Str( TVDBArt <> Nil ) + ", FanartTVJSON : " + Str( FanartTVJSON <> Nil ) + " ) - " App.ErrorMessage = Info + "Start" Dim Sckt as New TVDBSckt Sckt.Yield = True Dim TimeOut as Integer = Prefs.integerForKey("TimeOut") Dim Lang as String = Prefs.stringForKey("DBLanguage") If Lang = "gb" Then Lang = "en" App.ErrorMessage = Info + "Process TVDB Art" // ## TVDB Art // :9 Dim LastValue as Integer = dlgProgress.ProgressValue Dim LastMax as Integer = dlgProgress.ProgressMax If NOT CommonCore.MassSearch Then dlgProgress.Reset If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kProcessing + ":", "TVDB " + Loc.kImages + " " + Loc.mTabInfo + "..." ) Else dlgProgress.debug( "TVDB " + Loc.kImages + " " + Loc.mTabInfo + "..." ) If TVDBArt <> Nil And NOT TVDBArt.IsArray Then Dim jT as New JSONItem jT.Append( TVDBArt ) TVDBArt = jT End If Dim FirstPoster, FirstFanart, FirstBanner, SeasonLanguage(), SeasonPosterURLs(), SeasonPosterNrs(), SeasonBannerURLs(), SeasonBannerNrs(), SeasonFanartURLs(), SeasonFanartNrs() as String If TVDBArt <> Nil And TVDBArt.IsArray Then For i as Integer = 0 to TVDBArt.Count - 1 Dim jItem as New JSONItem jItem = TVDBArt.Child(i) If NOT jItem.HasName("BannerType") Then Continue App.ErrorMessage = Info + "Process TVDB Art / jItem : " + Str( jItem <> Nil ) + " " + Str( i ) + " of " + Str( TVDBArt.Count - 1 ) Select Case jItem.Value("BannerType") case "poster" // Posters App.ErrorMessage = App.ErrorMessage + " * Posters" TVAttr.ART_PosterURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") If FirstPoster = "" And jItem.HasName("Language") And ( jItem.Value("Language") = Lang Or jItem.Value("Language") = "" ) Then FirstPoster = TVCore.GraphicsPath + jItem.Value("BannerPath") End If case "fanart" // Backdrops App.ErrorMessage = App.ErrorMessage + " * Fanarts" TVAttr.ART_FanartURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") TVAttr.ART_FanartThumbURLs.Append TVCore.GraphicsPath + jItem.Value("ThumbnailPath") TVAttr.ART_FanartDimensions.Append jItem.Value("BannerType2") If FirstFanart = "" And jItem.HasName("Language") And ( jItem.Value("Language") = Lang OR jItem.Value("Language") = "" ) Then FirstFanart = TVCore.GraphicsPath + jItem.Value("BannerPath") End If case "season" // Posters OR Banners (season OR seasonwide) App.ErrorMessage = App.ErrorMessage + " * Season" TVAttr.ART_SeasonURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") TVAttr.ART_SeasonNumbers.Append jItem.Value("Season") SeasonLanguage.Append jItem.Value("Language") 'End If If jItem.Value("BannerType2") = "season" Then SeasonPosterURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") SeasonPosterNrs.Append jItem.Value("Season") ElseIf jItem.Value("BannerType2") = "seasonwide" Then SeasonBannerURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") SeasonBannerNrs.Append jItem.Value("Season") End If case "series" // Banners App.ErrorMessage = App.ErrorMessage + " * Banners" TVAttr.ART_BannerURLs.Append TVCore.GraphicsPath + jItem.Value("BannerPath") If FirstBanner = "" And jItem.HasName("Language") And ( jItem.Value("Language") = Lang OR jItem.Value("Language") = "" ) Then FirstBanner = TVCore.GraphicsPath + jItem.Value("BannerPath") End If End Select Next End If // Fanart.TV Dim LogoHDURLs(), LogoURLs(), ClearArtHDURLs(), ClearArtURLs(), TVThumbURLs(), CharacterArtURLs() as String Dim SeasonThumbURLs(), SeasonThumbNrs() as String If Prefs.boolForKey("FanartTVEnabled") Then App.ErrorMessage = Info + "Process Fanart.TV" // Fanart.TV // :10 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kProcessing + ":", "Fanart.tv " + Loc.kImages + " " + Loc.mTabInfo + "..." ) Else dlgProgress.debug( "Fanart.tv " + Loc.kImages + " " + Loc.mTabInfo + "..." ) App.ErrorMessage = Info + "Process Fanart.TV: Banners" // -- Banner If FanartTVJSON <> Nil And FanartTVJSON.HasName("tvbanner") And FanartTVJSON.Child("tvbanner").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("tvbanner").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("tvbanner").Child(i) TVAttr.ART_BannerURLs.Append jItem.Value("url") Next End If App.ErrorMessage = Info + "Process Fanart.TV: Fanart" // -- Fanart If FanartTVJSON <> Nil And FanartTVJSON.HasName("showbackground") And FanartTVJSON.Child("showbackground").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("showbackground").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("showbackground").Child(i) TVAttr.ART_FanartURLs.Append jItem.Value("url") TVAttr.ART_FanartDimensions.Append "1920x1080" TVAttr.ART_FanartThumbURLs.Append jItem.Value("url") + "/preview" // Season fanart If jItem.Value("season") <> "" Then SeasonFanartURLs.Append jItem.Value("url") SeasonFanartNrs.Append jItem.Value("season") End If Next End If App.ErrorMessage = Info + "Process Fanart.TV: HD ClearArt" // -- HD ClearArt If FanartTVJSON <> Nil And FanartTVJSON.HasName("hdclearart") And FanartTVJSON.Child("hdclearart").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("hdclearart").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("hdclearart").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then ClearArtHDURLs.Append jItem.Value("url") Next If ClearArtHDURLs.Ubound = -1 And FanartTVJSON.Child("hdclearart").Count > 0 Then ClearArtHDURLs.Append( FanartTVJSON.Child("hdclearart").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: ClearArt" // -- ClearArt If FanartTVJSON <> Nil And FanartTVJSON.HasName("clearart") And FanartTVJSON.Child("clearart").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("clearart").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("clearart").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then ClearArtURLs.Append jItem.Value("url") Next If ClearArtURLs.Ubound = -1 And FanartTVJSON.Child("clearart").Count > 0 Then ClearArtURLs.Append( FanartTVJSON.Child("clearart").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: HD Logo" // -- HD Logo If FanartTVJSON <> Nil And FanartTVJSON.HasName("hdtvlogo") And FanartTVJSON.Child("hdtvlogo").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("hdtvlogo").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("hdtvlogo").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then LogoHDURLs.Append jItem.Value("url") Next If LogoHDURLs.Ubound = -1 And FanartTVJSON.Child("hdtvlogo").Count > 0 Then LogoHDURLs.Append( FanartTVJSON.Child("hdtvlogo").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: Logo" // -- Logo If FanartTVJSON <> Nil And FanartTVJSON.HasName("clearlogo") Then For i as Integer = 0 to FanartTVJSON.Child("clearlogo").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("clearlogo").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then LogoURLs.Append jItem.Value("url") Next If LogoURLs.Ubound = -1 And FanartTVJSON.Child("clearlogo").Count > 0 Then LogoURLs.Append( FanartTVJSON.Child("clearlogo").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: Thumb" // -- Thumb If FanartTVJSON <> Nil And FanartTVJSON.HasName("tvthumb") And FanartTVJSON.Child("tvthumb").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("tvthumb").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("tvthumb").Child(i) TVThumbURLs.Append jItem.Value("url") Next If TVThumbURLs.Ubound = -1 And FanartTVJSON.Child("tvthumb").Count > 0 Then TVThumbURLs.Append( FanartTVJSON.Child("tvthumb").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: CharacterArt" // -- CharacterArt If FanartTVJSON <> Nil And FanartTVJSON.HasName("characterart") And FanartTVJSON.Child("characterart").IsArray Then For i as Integer = 0 to FanartTVJSON.Child("characterart").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("characterart").Child(i) CharacterArtURLs.Append jItem.Value("url") Next If CharacterArtURLs.Ubound = -1 And FanartTVJSON.Child("characterart").Count > 0 Then CharacterArtURLs.Append( FanartTVJSON.Child("characterart").Child(0).Value("url") ) End If App.ErrorMessage = Info + "Process Fanart.TV: SeasonThumb" // -- SeasonThumb If FanartTVJSON <> Nil And FanartTVJSON.HasName("seasonthumb") Then For i as Integer = 0 to FanartTVJSON.Child("seasonthumb").Count -1 Dim jItem as New JSONItem jItem = FanartTVJSON.Child("seasonthumb").Child(i) If jItem.Value("lang") = Lang OR jItem.Value("lang") = "" Then SeasonThumbURLs.Append jItem.Value("url") SeasonThumbNrs.Append jItem.Value("season") End If Next End If End If // @END Fanart.tv enabled // -- App.ErrorMessage = Info + "Set FirstArt Download list" // Set download list If FirstPoster = "" And TVAttr.ART_PosterURLs.Ubound > -1 Then FirstPoster = TVAttr.ART_PosterURLs(0) If FirstFanart = "" And TVAttr.ART_FanartURLs.Ubound > -1 Then FirstFanart = TVAttr.ART_FanartURLs(0) If FirstBanner = "" And TVAttr.ART_BannerURLs.Ubound > -1 Then FirstBanner = TVAttr.ART_BannerURLs(0) Dim HighestSeason as Integer = -1 For i as Integer = 0 to TVAttr.ART_SeasonNumbers.Ubound If Val( TVAttr.ART_SeasonNumbers(i) ) > HighestSeason Then HighestSeason = Val( TVAttr.ART_SeasonNumbers(i) ) Next App.ErrorMessage = Info + "Match up all available aseasons from local episodes" // Match up all available seasons from local episodes Dim EpisodeFiles() as FolderItem = FindEpisodeFiles( TVAttr.FolderParent ) Dim AllSeasons() as String AllSeasons.Append "-1" // Season-All art For each episode as FolderItem in EpisodeFiles Dim s as String = RegExEpisode( Episode ) If s <> "" Then AllSeasons.Append s.NthField("x",1) Next App.ErrorMessage = Info + "Make sure that there are no duplicates" // Make sure that there are no duplicates. AllSeasons.Sort AllSeasons = RemoveDuplicatesFromArray( AllSeasons ) AllSeasons = RemoveDuplicatesFromArray( AllSeasons ) If False Then ReDim AllSeasons(-1) For i as Integer = -1 to HighestSeason AllSeasons.Append str( i ) Next End If App.ErrorMessage = Info + "Get SeasonArt URLs" // Get season art urls Dim tmpSeasonPosterURLs(), tmpSeasonPosterNrs() as String Dim tmpSeasonFanartURLs(), tmpSeasonFanartNrs() as String Dim tmpSeasonBannerURLs(), tmpSeasonBannerNrs() as String Dim tmpSeasonThumbsURLs(), tmpSeasonThumbsNrs() as String 'For i as Integer = -1 to HighestSeason For each Season as String in AllSeasons Dim i as Integer = Val( Season ) App.ErrorMessage = Info + "Season " + Str( i ) + " Posters" // Order Season Posters For n as Integer = 0 to SeasonPosterNrs.Ubound If Val( SeasonPosterNrs(n) ) = i Then tmpSeasonPosterURLs.Append SeasonPosterURLs(n) tmpSeasonPosterNrs.Append SeasonPosterNrs(n) Exit End If Next App.ErrorMessage = Info + "Season " + Str( i ) + " Fanarts" // Order Season Fanart For n as Integer = 0 to SeasonFanartNrs.Ubound If Val( SeasonFanartNrs(n) ) = i And SeasonFanartNrs(n) <> "all" Then tmpSeasonFanartURLs.Append SeasonFanartURLs(n) tmpSeasonFanartNrs.Append SeasonFanartNrs(n) Exit ElseIf i = -1 And SeasonFanartNrs(n) = "All" Then tmpSeasonFanartURLs.Append SeasonFanartURLs(n) tmpSeasonFanartNrs.Append SeasonFanartNrs(n) Exit End If Next App.ErrorMessage = Info + "Season " + Str( i ) + " Banners" // Order Season Banners For n as Integer = 0 to SeasonBannerNrs.Ubound If Val( SeasonBannerNrs(n) ) = i Then tmpSeasonBannerURLs.Append SeasonBannerURLs(n) tmpSeasonBannerNrs.Append SeasonBannerNrs(n) Exit End If Next App.ErrorMessage = Info + "Season " + Str( i ) + " Thumbs" // Order Season Thumbs For n as Integer = 0 to SeasonThumbNrs.Ubound If Val( SeasonThumbNrs(n) ) = i And SeasonThumbNrs(n) <> "all" Then tmpSeasonThumbsURLs.Append SeasonThumbURLs(n) tmpSeasonThumbsNrs.Append SeasonThumbNrs(n) Exit ElseIf i = -1 And SeasonThumbNrs(n) = "All" Then tmpSeasonThumbsURLs.Append SeasonThumbURLs(n) tmpSeasonThumbsNrs.Append SeasonThumbNrs(n) Exit End If Next Next SeasonPosterURLs = tmpSeasonPosterURLs SeasonPosterNrs = tmpSeasonPosterNrs SeasonFanartURLs = tmpSeasonFanartURLs SeasonFanartNrs = tmpSeasonFanartNrs SeasonBannerURLs = tmpSeasonBannerURLs SeasonBannerNrs = tmpSeasonBannerNrs SeasonThumbURLs = tmpSeasonThumbsURLs SeasonThumbNrs = tmpSeasonThumbsNrs Dim DBID as String = TVAttr.ID_IMDb If DBID = "" Then DBID = TVAttr.ID_TVDB App.ErrorMessage = Info + "Downloading Poster" // :11 Downloading Poster If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kPoster + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kPoster.Lowercase + " " + Loc.kImage.Lowercase + "..." ) Dim PosterName as String = "poster.jpg" If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then PosterName = "Set_" + TVAttr.FolderParent.Name + "_1.jpg" Dim PosterFile as FolderItem = TVAttr.FolderParent.Child( PosterName ) If Prefs.boolForKey("AutoDownloadPoster") And FirstPoster <> "" And ( PosterFile = Nil OR NOT PosterFile.Exists ) Then If Prefs.stringForKey( "PosterSize" ) = "original" Then TVAttr.ART_Poster = URL2Picture( FirstPoster, TVAttr.FolderParent, PosterName ) Else TVAttr.ART_Poster = Nil TVAttr.ART_Poster = Picture.FromData( CURLGet( FirstPoster ) ) ', TimeOut ) ) Sckt.Close If TVAttr.ART_Poster <> Nil Then Dim Width as Integer = Val( Prefs.stringForKey( "PosterSize" ).ReplaceAll("w","") ) Dim Height as Integer = TVAttr.ART_Poster.Height * ( Width / TVAttr.ART_Poster.Width ) If ScaleImage( TVAttr.ART_Poster, Width, Height ) <> Nil Then SaveImage( ScaleImage( TVAttr.ART_Poster, Width, Height ), TVAttr.FolderParent.Child( PosterName ), FileTypes.ImageJpeg ) End If End If End If CacheImageSet( TVAttr.ART_Poster, DBID + ".television.poster.jpg" ) App.ErrorMessage = Info + "Downloading Fanart" // :12 Downloading Fanart If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kFanart + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kFanart.Lowercase + " " + Loc.kImage.Lowercase + "..." ) Dim FanartName as String = "fanart.jpg" If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then FanartName = "Set_" + TVAttr.FolderParent.Name + "_1.fanart.jpg" Dim FanartFile as FolderItem = TVAttr.FolderParent.Child( FanartName ) If Prefs.boolForKey("AutoDownloadBackdrop") And FirstFanart <> "" And ( FanartFile = Nil OR NOT FanartFile.Exists ) Then If Prefs.stringForKey( "FanartSize" ) = "original" Then TVAttr.ART_Fanart = URL2Picture( FirstFanart, TVAttr.FolderParent, FanartName ) Else TVAttr.ART_Fanart = Nil TVAttr.ART_Fanart = Picture.FromData( CURLGet( FirstFanart ) ) ', TimeOut * 2 ) ) Sckt.Close If TVAttr.ART_Fanart <> Nil Then Dim Width as Integer = Val( Prefs.stringForKey( "FanartSize" ).ReplaceAll("w","") ) Dim Height as Integer = TVAttr.ART_Fanart.Height * ( Width / TVAttr.ART_Fanart.Width ) If ScaleImage( TVAttr.ART_Fanart, Width, Height ) <> Nil Then SaveImage( ScaleImage( TVAttr.ART_Fanart, Width, Height ), TVAttr.FolderParent.Child( FanartName ), FileTypes.ImageJpeg ) End If End If End If CacheImageSet( TVAttr.ART_Fanart, TVAttr.ID_IMDb + ".television.fanart.jpg" ) App.ErrorMessage = Info + "Downloading Banner" // :13 Downloading Banner If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kBanner + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kBanner.Lowercase + " " + Loc.kImage.Lowercase + "..." ) Dim BannerName as String = "banner.jpg" If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then BannerName = "Set_" + TVAttr.FolderParent.Name + "_1.banner.jpg" Dim BannerFile as FolderItem = TVAttr.FolderParent.Child( BannerName ) If Prefs.boolForKey("AutoDownloadBanner") And FirstBanner <> "" And ( BannerFile = Nil OR NOT BannerFile.Exists ) Then URL2Picture( FirstBanner, TVAttr.FolderParent, BannerName ) App.ErrorMessage = Info + "Downloading Logo" // :14 Downloading Logo If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kLogo + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kLogo.Lowercase + " " + Loc.kImage.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadLogo") And NOT TVAttr.FolderParent.Child("logo.png").Exists Then Dim FirstLogo as String If LogoHDURLs <> Nil And LogoHDURLs.Ubound > -1 Then FirstLogo = LogoHDURLs(0) ElseIf LogoURLs <> Nil And LogoURLs.Ubound > -1 Then FirstLogo = LogoURLs(0) End If If FirstLogo <> "" And TVAttr.FolderParent <> Nil And TVAttr.FolderParent.Exists Then URL2Picture( FirstLogo, TVAttr.FolderParent, "logo.png" ) End If App.ErrorMessage = Info + "Downloading ClearArt" // :15 Downloading ClearArt If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kClearArt + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kClearArt.Lowercase + " " + Loc.kImage.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadClearArt") And NOT TVAttr.FolderParent.Child("clearart.png").Exists Then Dim FirstClearArt as String If ClearArtHDURLs.Ubound > -1 Then FirstClearArt = ClearArtHDURLs(0) ElseIf ClearArtURLs.Ubound > -1 Then FirstClearArt = ClearArtURLs(0) End If If FirstClearArt <> "" Then URL2Picture( FirstClearArt, TVAttr.FolderParent, "clearart.png" ) End If App.ErrorMessage = Info + "Downloading Landscape" // :16 Downloading Landscape If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kTVThumb + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kTVThumb.Lowercase + " " + Loc.kImage.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadThumb") And NOT TVAttr.FolderParent.Child("landscape.jpg").Exists And TVThumbURLs.Ubound > -1 Then URL2Picture( TVThumbURLs(0), TVAttr.FolderParent, "landscape.jpg" ) App.ErrorMessage = Info + "Downloading CharacterArt" // :17 Downloading CharacterArt If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kCharacterArt + " " + Loc.kImage.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kCharacterArt.Lowercase + " " + Loc.kImage.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadCharacterArt") And NOT TVAttr.FolderParent.Child("character.png").Exists And CharacterArtURLs.Ubound > -1 Then URL2Picture( CharacterArtURLs(0), TVAttr.FolderParent, "character.png" ) App.ErrorMessage = Info + "Downloading Season Posters" // :18 Downloading Season Posters If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kSeason + " " + Loc.kPoster + " " + Loc.kImages.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kSeason + " " + Loc.kPoster.Lowercase + " " + Loc.kImages.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadSeasonArt") Then For i as Integer = 0 to SeasonPosterURLs.Ubound dlgProgress.debug( Str(i+1) + Loc.k1of2 + Str( SeasonPosterURLs.Ubound + 1 ) + " " + Loc.kSeason + " " + Loc.kPoster + " " + Loc.kImages.Lowercase ) Dim Parent as FolderItem = TVAttr.FolderParent Dim SeasonPosterFile as FolderItem If SeasonPosterNrs(i) = "0" Then 'If Parent.Child( "Specials" ).Exists Then Parent = Parent.Child( "Specials" ) SeasonPosterFile = Parent.Child( "season-specials-poster.jpg" ) ElseIf SeasonPosterNrs(i) = "-1" Then SeasonPosterFile = Parent.Child( "season-all-poster.jpg" ) Else Dim SeasonDisplay as String = SeasonPosterNrs(i) If SeasonDisplay.Len = 1 Then SeasonDisplay = " 0" + SeasonDisplay Else SeasonDisplay = " " + SeasonDisplay 'If Parent.Child( "Season" + SeasonDisplay ).Exists Then Parent = Parent.Child( "Season" + SeasonDisplay ) SeasonPosterFile = Parent.Child( "season" + Trim( SeasonDisplay ) + "-poster.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonPosterFile = Parent.Child( "season " + SeasonPosterNrs(i) + ".jpg" ) End If // Download If NOT SeasonPosterFile.Exists Then URL2Picture( SeasonPosterURLs(i), Parent, SeasonPosterFile.Name ) Next End If App.ErrorMessage = Info + "Downloading Season Banners" // ## Season Banners If Prefs.boolForKey("AutoDownloadSeasonArt") Then Dim Pic as Picture For i as Integer = 0 to SeasonBannerURLs.Ubound dlgProgress.debug( Str(i+1) + Loc.k1of2 + Str( SeasonBannerURLs.Ubound + 1 ) + " " + Loc.kSeason + " " + Loc.kBanner.Lowercase + " " + Loc.kImages.Lowercase ) Dim Parent as FolderItem = TVAttr.FolderParent Dim SeasonBannerFile as FolderItem If SeasonBannerNrs(i) = "0" Then 'If Parent.Child( "specials" ).Exists Then Parent = Parent.Child( "specials" ) SeasonBannerFile = Parent.Child( "season-specials-banner.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonBannerFile = Parent.Child( "specials.banner.jpg" ) ElseIf SeasonBannerNrs(i) = "-1" OR SeasonBannerNrs(i) = "All"Then SeasonBannerFile = Parent.Child( "season-all-banner.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonBannerFile = Parent.Child( "seasonall.banner.jpg" ) Else Dim SeasonDisplay as String = SeasonBannerNrs(i) If SeasonDisplay.Len = 1 Then SeasonDisplay = " 0" + SeasonDisplay Else SeasonDisplay = " " + SeasonDisplay 'If Parent.Child( "season" + SeasonDisplay ).Exists Then Parent = Parent.Child( "season" + SeasonDisplay ) SeasonBannerFile = Parent.Child( "season" + Trim( SeasonDisplay ) + "-banner.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonBannerFile = Parent.Child( "season " + Str( SeasonBannerNrs(i) ) + ".banner.jpg" ) End If // Download If NOT SeasonBannerFile.Exists Then URL2Picture( SeasonBannerURLs(i), Parent, SeasonBannerFile.Name ) Next End If App.ErrorMessage = Info + "Downloading Season Thumbs" // :20 Downloading Season Thumbs If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kSeason + " " + Loc.kThumb.Lowercase + " " + Loc.kImages.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kSeason + " " + Loc.kThumb.Lowercase + " " + Loc.kImages.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadSeasonArt") Then For i as Integer = 0 to SeasonThumbURLs.Ubound dlgProgress.debug( Str(i+1) + Loc.k1of2 + Str( SeasonThumbURLs.Ubound + 1 ) + " " + Loc.kSeason + " " + Loc.kImages.Lowercase ) Dim Parent as FolderItem = TVAttr.FolderParent Dim SeasonLandscapeFile as FolderItem If SeasonThumbNrs(i) = "0" Then 'If Parent.Child( "specials" ).Exists Then Parent = Parent.Child( "specials" ) SeasonLandscapeFile = Parent.Child("season-specials-landscape.jpg") If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonLandscapeFile = Parent.Child( "specials.landscape.jpg" ) ElseIf SeasonThumbNrs(i) = "-1" OR SeasonThumbNrs(i) = "All" Then SeasonLandscapeFile = Parent.Child( "season-all-landscape.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonLandscapeFile = Parent.Child( "seasonall.landscape.jpg" ) Else Dim SeasonDisplay as String = SeasonThumbNrs(i) If SeasonDisplay.Len = 1 Then SeasonDisplay = " 0" + SeasonDisplay Else SeasonDisplay = " " + SeasonDisplay 'If Parent.Child( "season" + SeasonDisplay ).Exists Then Parent = Parent.Child( "season" + SeasonDisplay ) SeasonLandscapeFile = Parent.Child( "season" + Trim( SeasonDisplay ) + "-landscape.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonLandscapeFile = Parent.Child( "season " + Str( SeasonThumbNrs(i) ) + ".landscape.jpg" ) End If // Download If NOT SeasonLandscapeFile.Exists Then URL2Picture( SeasonThumbURLs(i), Parent, SeasonLandscapeFile.Name ) Next End If App.ErrorMessage = Info + "Downloading Season Fanarts" // :21 Downloading Season Fanarts If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kSeason + " " + Loc.kFanart.Lowercase + " " + Loc.kImages.Lowercase + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kFanart.Lowercase + " " + Loc.kBanner.Lowercase + " " + Loc.kImages.Lowercase + "..." ) If Prefs.boolForKey("AutoDownloadSeasonArt") Then 'If NOT CommonCore.MassSearch Then dlgProgress.Reset For i as Integer = 0 to SeasonFanartURLs.Ubound dlgProgress.debug( Str(i+1) + Loc.k1of2 + Str( SeasonFanartURLs.Ubound + 1 ) + " " + Loc.kSeason + " " + Loc.kFanart + " " + Loc.kImages.Lowercase ) Dim Parent as FolderItem = TVAttr.FolderParent Dim SeasonFanartFile as FolderItem If SeasonFanartNrs(i) = "0" Then 'If Parent.Child( "specials" ).Exists Then Parent = Parent.Child( "specials" ) SeasonFanartFile = Parent.Child( "season-specials-fanart.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonFanartFile = Parent.Child( "specials.fanart.jpg" ) ElseIf SeasonFanartNrs(i) = "-1" OR SeasonFanartNrs(i) = "All" Then SeasonFanartFile = Parent.Child( "season-all-fanart.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonFanartFile = Parent.Child( "seasonall.fanart.jpg" ) Else Dim SeasonDisplay as String = SeasonFanartNrs(i) If SeasonDisplay.Len = 1 Then SeasonDisplay = " 0" + SeasonDisplay Else SeasonDisplay = " " + SeasonDisplay 'If Parent.Child( "season" + SeasonDisplay ).Exists Then Parent = Parent.Child( "season" + SeasonDisplay ) SeasonFanartFile = Parent.Child( "season" + Trim( SeasonDisplay ) + "-fanart.jpg" ) If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonFanartFile = Parent.Child( "season " + Str( SeasonFanartNrs(i) ) + ".fanart.jpg" ) End If // Download If NOT SeasonFanartFile.Exists Then URL2Picture( SeasonFanartURLs(i), Parent, SeasonFanartFile.Name ) Next End If App.ErrorMessage = Info + "Downloading Extra Fanarts" // :22 Downloading extra fanart If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kExtraFanarts + "..." ) Else dlgProgress.debug( Loc.kDownloading + " " + Loc.kExtraFanarts + "..." ) If Prefs.boolForKey("AutoDownloadExtraFanart") Then For i as Integer = 0 to TVAttr.ART_FanartURLs.Ubound If Prefs.integerForKey( "MaxBackdrops" ) > 0 And i = Prefs.integerForKey( "MaxBackdrops" ) Then Exit Dim Max as Integer = TVAttr.ART_FanartURLs.Ubound + 1 If Prefs.integerForKey( "MaxBackdrops" ) > 0 And Prefs.integerForKey( "MaxBackdrops" ) < Max Then Max = Prefs.integerForKey( "MaxBackdrops" ) dlgProgress.Debug( Str( i+1 ) + Loc.k1of2 + Str( Max ) + " " + Loc.kExtraFanarts + " " + Loc.kImages.Lowercase ) Dim Destination as FolderItem = TVAttr.FolderParent.Child("extrafanart") If Destination <> Nil And NOT Destination.Exists Then Destination.CreateAsFolder Dim Name() as String = TVAttr.ART_FanartURLs(i).Split("/") Dim FileName as String = Name( Name.Ubound ) If Destination.Child( FileName ).Exists Then Continue Dim Width as Integer = Val( Prefs.stringForKey( "FanartSize" ).ReplaceAll( "w", "" ) ) If Width = 0 Then URL2Picture( TVAttr.ART_FanartURLs(i), Destination, FileName ) Else Dim CurFanart as Picture = Picture.FromData( CURLGet( TVAttr.ART_FanartURLs(i) ) ) ', TimeOut * 2 ) ) Sckt.Close Dim Factor as Double = CurFanart.Height / CurFanart.Width Dim ScaledImage as Picture = ScaleImage( CurFanart, Width, Width * Factor ) SaveImage( ScaledImage, Destination.Child( FileName ), FileTypes.ImageJpeg ) End If Next End If If NOT CommonCore.MassSearch Then dlgProgress.ProgressMax = LastMax dlgProgress.ProgressValue = LastValue End If End Sub #tag EndMethod #tag Method, Flags = &h0 Sub GetShowNFO(ID as String, Update as Boolean = False) #pragma DisableBackgroundTasks #If NOT DebugBuild Then #pragma DisableBoundsChecking '#pragma NilObjectChecking False #pragma StackOverflowChecking False #endif Dim JSONString, TVInfo as String Dim sckt as New TVDBSckt sckt.Yield = True TVInfo = " " + TVAttr.FolderParent.Name + " " + Loc.mTabInfo.Lowercase + "..." // Play undercover spy. Dim rand as New Random Dim IP as String = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) Sckt.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) Sckt.SetRequestHeader( "User-agent", "Mozilla/" + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,3) ) + " (Windows NT " + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,2) ) + "; rv:2.0.1) Gecko/20100101 Firefox/" + Str( rand.InRange(3,5) ) + ".0.1" ) 'Anonymouse( sckt ) // ## Temporary Save Dim PrevTitle, PrevTitleSort, PrevTitleOriginal, PrevGenres(), PrevTagline, PrevTags() as String If Update Then PrevTitle = TVAttr.Title PrevTitleSort = TVAttr.TitleSort PrevTitleOriginal = TVAttr.TitleOriginal PrevTagline = TVAttr.DescriptionTagline PrevGenres = TVAttr.Genres PrevTags = TVAttr.Tags End If // ## Reset properties TVAttr.ClearProperties // ## Reload (some) properties If Update Then TVAttr.Title = PrevTitle TVAttr.TitleSort = PrevTitleSort TVAttr.TitleOriginal = PrevTitleOriginal TVAttr.DescriptionTagline = PrevTagline TVAttr.Genres = PrevGenres TVAttr.Tags = PrevTags End If // ## Reset progress If NOT CommonCore.MassSearch Then dlgProgress.Reset // ## Gather information Dim Lang as String = Prefs.stringForKey("DBLanguage") Dim TimeOut as Integer = Prefs.integerForKey("TimeOut") / 2 If Lang = "gb" Then Lang = "en" // -- Try to get TVDB ID if only IMDb ID is available. // :1 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Alias]" + TVInfo, 1, 30 ) Else dlgProgress.debug( "[TVDB Alias]" + TVInfo ) If ID.Left(2) = "tt" Then ID = IMDb2TVDB( ID ) // -- Get general TVDB Info // :2 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Info]" + TVInfo ) Else dlgProgress.debug( "[TVDB Info]" + TVInfo ) Dim TVDB as New JSONItem If ID.Left(2) <> "tt" Then Dim XMLString as String = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID ), TimeOut ), Encodings.UTF8 ) if XMLString.Contains( "404 Not Found" ) then XMLString = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID, "en" ), TimeOut ), Encodings.UTF8 ) End If 'XMLString = DecodingFromHTMLMBS( XMLString ) sckt.Close 'JSONString = XMLString.XML2JSON 'If JSONString.ValidJSON("TVDB Info") Then TVDB.Load JSONString TVDB = XMLString.XML2JSON If TVDB <> Nil And TVDB.HasName("Data") And TVDB.ToString.InStr( 0, "Series" ) > 0 And TVDB.Child("Data").HasName("Series") Then TVDB = TVDB.Child("Data").Child("Series") 'ProcessEpisodes XMLString XMLString = "" JSONString = "" End If // -- Get Actors info // :3 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Actors]" + TVInfo ) Else dlgProgress.debug( "[TVDB Actors]" + TVInfo ) Dim TVDBActors as New JSONItem If ID.Left(2) <> "tt" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "Actors", ID ), TimeOut ), Encodings.UTF8 ) sckt.Close 'JSONString = JSONString.XML2JSON 'If JSONString.ValidJSON("TVDB Actors") Then TVDBActors.Load JSONString TVDBActors = JSONString.XML2JSON If TVDBActors <> Nil And TVDBActors.HasName("Actors") And TVDBActors.ToString.InStr( 0, """Actor""") > 0 Then TVDBActors = TVDBActors.Child("Actors") 'and TVDBActors.Child("Actors").HasName("Actor") And TVDBActors.Child("Actors").Child("Actor").IsArray Then TVDBActors = TVDBActors.Child("Actors") JSONString = "" End If // -- Get TVDB Art // :4 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVDB Art]" + TVInfo ) Else dlgProgress.debug( "[TVDB Art]" + TVInfo ) Dim TVDBArt as New JSONItem If ID.Left(2) <> "tt" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "Art", ID ), TimeOut ), Encodings.UTF8 ) sckt.Close 'JSONString = JSONString.XML2JSON 'If JSONString.ValidJSON( "TVDB Art" ) Then TVDBArt.Load JSONString TVDBArt = JSONString.XML2JSON 'If TVDBArt.HasName("Banners") And TVDBArt.ToString.InStr("\""Banner\""") > 0 Then TVDBArt = TVDBArt.Child("Banners") 'And TVDBArt.Child("Banners").HasName("Banner") And TVDBArt.Child("Banners").Child("Banner").IsArray Then TVDBArt = TVDBArt.Child("Banners") If TVDBArt <> Nil And TVDBArt.HasName("Banners") And TVDBArt.ToString.InStr("""Banner""") > 0 And TVDBArt.Child("Banners").HasName("Banner") Then TVDBArt = TVDBArt.Child("Banners").Child("Banner") JSONString = "" End If // -- Get IMDb Info // :5 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[IMDb]" + TVInfo ) Else dlgProgress.debug( "[IMDb]" + TVInfo ) Dim IMDbID as String = ID If IMDbID.Left(2) <> "tt" Then IMDbID = "" If TVDB <> Nil And TVDB.HasName("IMDB_ID") And TVDB.Value("IMDB_ID") <> "" Then IMDbID = TVDB.Value("IMDB_ID") End If Dim IMDb as New JSONItem If IMDbID.Left(2) = "tt" Then IMDb = GetIMDbJSON( IMDbID ) // -- Get FanartTV Info // :6 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[Fanart.TV Art]" + TVInfo ) Else dlgProgress.debug( "[Fanart.TV]" + TVInfo ) JSONString = Trim( DefineEncoding( sckt.Get( URLCore.FanartTV( ID ), TimeOut ), Encodings.UTF8 ) ) 'Dim FirstBracketLoc as Integer = JSONString.InStr(2, "{" ) 'JSONString = Trim( JSONString.Right( JSONString.Len - FirstBracketLoc + 1) ) Dim FanartTVJSON as New JSONItem If JSONString.ValidJSON("Fanart.TV") Then FanartTVJSON.Load JSONString JSONString = "" // -- TVRage // :7 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVRage]" + TVInfo ) Else dlgProgress.debug( "[TVRage]" + TVInfo ) Dim Title as String if IMDb <> nil and IMDb.HasName("ORIGINAL_TITLE") then Title = IMDb.Value("ORIGINAL_TITLE") If title = "" and TVDB <> Nil And TVDB.HasName("SeriesName") Then Title = TVDB.Value("SeriesName") If Title = "" And IMDb.HasName("TITLE") Then Title = IMDb.Value("TITLE") dim year as String if IMDb <> Nil and IMDb.HasName("YEAR") then year = IMDb.Value("YEAR") if Title <> "" then ShowStatus( Title, ID ) end if // -- TV Tunes // :8 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", "[TVTunes]" + TVInfo ) Else dlgProgress.debug( "[TVTunes]" + TVInfo ) If Prefs.boolForKey("AutoDownloadThemesong") And Title <> "" Then GetThemeSong( Title ) // ## ---------- Process Information ---------- ## // :8 If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kProcessing + ":", Trim( TVInfo ) ) Else dlgProgress.debug( Loc.kProcessing + TVInfo ) // ## IDs TVAttr.ID_TVDB = ID TVAttr.ID_IMDb = IMDbID 'TVAttr.ID_TVRage = TVRageID If TVDB <> Nil And TVDB.HasName("IMDB_ID") And TVDB.Value("IMDB_ID") <> "" Then TVAttr.ID_IMDb = TVDB.Value("IMDB_ID") ElseIf IMDb <> Nil And IMDb.HasName("TITLE_ID") And IMDb.Value("TITLE_ID") <> "" Then TVAttr.ID_IMDb = IMDb.Value("TITLE_ID") End If If TVDB <> Nil And TVDB <> Nil And TVDB.HasName("id") And TVDB.Value("id") <> "" Then TVAttr.ID_TVDB = TVDB.Value("id") 'If TVRage <> Nil And TVRage.HasName("showid") And TVRage.Value("showid") <> "" Then TVAttr.ID_TVRage = TVRage.Value("showid") // ## Title If Update Then TVAttr.Title = PrevTitle 'If TVAttr.Title = "" And IMDb.HasName("USA_TITLE") And Lang = "en" Then TVAttr.Title = IMDb.Value("USA_TITLE") If TVAttr.Title = "" And IMDb <> Nil And IMDb.HasName("TITLE") And Lang <> "en" Then TVAttr.Title = IMDb.Value("TITLE") If TVAttr.Title = "" And TVDB <> Nil And TVDB.HasName("SeriesName") Then TVAttr.Title = TVDB.Value("SeriesName") TVAttr.Title = ReplaceAll( TVAttr.Title, "&", "&" ) // ## Title Original If Update Then TVAttr.TitleOriginal = PrevTitleOriginal If TVAttr.TitleOriginal = "" And IMDb <> Nil And IMDb.HasName("ORIGINAL_TITLE") And IMDb.Value("ORIGINAL_TITLE") <> "" Then TVAttr.TitleOriginal = IMDb.Value("ORIGINAL_TITLE") If TVAttr.TitleOriginal = "" And IMDb <> Nil And IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then TVAttr.TitleOriginal = IMDb.Value("TITLE") If TVAttr.TitleOriginal = "" And TVAttr.Title <> "" Then TVAttr.TitleOriginal = TVAttr.Title If TVAttr.TitleOriginal <> "" And TVAttr.Title = "" Then TVAttr.Title = TVAttr.TitleOriginal TVAttr.TitleOriginal = ReplaceAll( TVAttr.TitleOriginal, "&", "&" ) // ## Sort Title If PrevTitleSort = "" Then TVAttr.TitleSort = Articulator( TVAttr.Title ) Else TVAttr.TitleSort = PrevTitleSort // ## Tagline If IMDb <> Nil and IMDb.HasName("TAGLINE") And IMDb <> Nil And IMDb.Value("TAGLINE") <> "" Then TVAttr.DescriptionTagline = IMDb.Value("TAGLINE") TVAttr.DescriptionTagline = Trim( RegExThis( TVAttr.DescriptionTagline, "\(Season.*\)|\(Series.*\)", "" ) ) If TVAttr.DescriptionTagline <> "" Then TVAttr.DescriptionTaglines.Append TVAttr.DescriptionTagline TVAttr.DescriptionTagline = ReplaceAll( TVAttr.DescriptionTagline, "&", "&" ) // Extra Taglines If IMDb <> Nil And IMDb.HasName("TAGLINES") Then For i as Integer = 0 to IMDb.Child("TAGLINES").Count - 1 TVAttr.DescriptionTaglines.Append Trim( RegExThis( IMDb.Child("TAGLINES").Value(i), "\(Season.*\)|\(Series.*\)", "" ) ) Next TVAttr.DescriptionTaglines = RemoveDuplicatesFromArray( TVAttr.DescriptionTaglines ) If TVAttr.DescriptionTagline = "" And TVAttr.DescriptionTaglines.Ubound > -1 Then TVAttr.DescriptionTagline = TVAttr.DescriptionTaglines(0) End If // ## Plot If TVDB <> Nil And TVDB.HasName("Overview") And TVDB.Value("Overview") <> "" Then TVAttr.DescriptionPlot = DecodeHTML( TVDB.Value("Overview") ) // Partial storyline If ( Lang = "en" OR Lang = "gb" OR TVAttr.DescriptionPlot = "" ) And IMDb <> Nil And IMDb.HasName("STORYLINE") And IMDb.Value("STORYLINE") <> "" And IMDb.Value("STORYLINE").Len > TVAttr.DescriptionPlot.Len Then TVAttr.DescriptionPlot = IMDb.Value("STORYLINE") End If // Full Storyline If ( Lang = "en" OR Lang = "gb" OR TVAttr.DescriptionPlot = "" ) And IMDb <> Nil And IMDb.HasName("STORYLINES") And IMDb.Child("STORYLINES").Count > 0 Then Dim Plot as String = IMDb.Child("STORYLINES").Value( IMDb.Child("STORYLINES").Count -1 ) If Plot.InStr( 0, EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX ) > 0 Then Dim sx1 as Integer = Plot.InStr( 0, EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX + EndOfLine.UNIX ) Plot = Plot.Left( sx1 ) 'If Len( Plot ) > Len( TVAttr.DescriptionPlot ) Then TVAttr.DescriptionPlot = TVAttr.DescriptionPlot.Left( sx1 ) End If End If // ## Outline If IMDb <> Nil And IMDb.HasName("PLOT") And IMDb.Value("PLOT") <> "" Then TVAttr.DescriptionOutline = DecodeHTML( IMDb.Value("PLOT") ) If ( TVAttr.DescriptionPlot = "" And TVAttr.DescriptionPlot <> "" ) OR ( Lang <> "en" And Lang <> "gb" And TVAttr.DescriptionPlot <> "" ) Then Dim sx1 as Integer = TVAttr.DescriptionPlot.InStr( 0, "." ) + 1 If sx1 > 0 Then TVAttr.DescriptionOutline = TVAttr.DescriptionPlot.Left( sx1 ) End If // ## Premieré If TVDB <> Nil And TVDB.HasName("FirstAired") And TVDB.Value("FirstAired") <> "" Then TVAttr.DatePremiered = TVDB.Value("FirstAired") // Date If Val( TVAttr.DatePremiered.left(4) ) > 1000 Then TVAttr.DateYear = Val( TVAttr.DatePremiered.Left(4) ) // Year if TVAttr.DateYear = -1 and IMDb.HasName("YEAR") then TVAttr.DateYear = IMDb.Value("YEAR") // ## MPAA 'If TVDB.HasName("ContentRating") And TVDB.Value("ContentRating") <> "" Then TVAttr.RatingMPAA = TVDB.Value("ContentRating") 'If IMDb.HasName("MPAA_RATING") And Trim( IMDb.Value("MPAA_RATING") ) <> "" Then TVAttr.RatingMPAA = IMDb.Value("MPAA_RATING") If IMDb <> Nil And IMDb.HasName("CERTIFICATIONS") Then For i as Integer = 0 to IMDb.Child("CERTIFICATIONS").Count -1 TVAttr.RatingCertification.Append IMDb.Child("CERTIFICATIONS").Value(i) Next End If TVAttr.RatingCertification = RemoveDuplicatesFromArray( TVAttr.RatingCertification ) Dim USAMPAA as String For i as Integer = 0 to TVAttr.RatingCertification.Ubound If USAMPAA = "" And FlagCountry( TVAttr.RatingCertification(i).NthField(":", 1) ) = "en" Then USAMPAA = TVAttr.RatingCertification(i).NthField( ":", 2 ) If FlagCountry( TVAttr.RatingCertification(i).NthField(":", 1) ) = Prefs.stringForKey("DBLanguage") Then TVAttr.RatingMPAA = TVAttr.RatingCertification(i).NthField(":", 2) 'If TVAttr.ART_MPAARating <> Nil Then Exit End If Next If TVAttr.RatingMPAA = "" Then TVAttr.RatingMPAA = USAMPAA If Trim( TVAttr.RatingMPAA ) = "" And TVDB <> Nil And TVDB.HasName("ContentRating") Then TVAttr.RatingMPAA = TVDB.Value("ContentRating") // ## Rating If TVDB <> Nil And TVDB.HasName("Rating") And TVDB.Value("Rating") <> "" Then TVAttr.Rating = Val( TVDB.Value("Rating") ) If TVDB <> Nil And TVDB.HasName("RatingCount") And TVDB.Value("RatingCount") <> "" Then TVAttr.RatingVotes = Val( TVDB.Value("RatingCount") ) If IMDb <> Nil And IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then TVAttr.Rating = Val( IMDb.Value("RATING") ) If IMDb <> Nil And IMDb.HasName("VOTES") And IMDb.Value("VOTES") <> "" Then TVAttr.RatingVotes = Val( IMDb.Value("VOTES").ReplaceAll(",","") ) // ## Genres ReDim TVAttr.Genres(-1) TVAttr.Genres = PrevGenres Dim tmpArray() as String // TVDB If TVDB <> Nil And TVDB.HasName("Genre") Then tmpArray = Split( TVDB.Value("Genre").ReplaceAll("Science-Fiction","Science Fiction").ReplaceAll(" and ", " & "), "|" ) // IMDB If ( Lang = "en" or Lang = "gb" ) And IMDb <> Nil And IMDb.HasName("GENRES") Then Dim Arry() as String = JSONArray( IMDb.Child("GENRES") ) For i as Integer = 0 to Arry.Ubound tmpArray.Append Arry(i).ReplaceAll("Sci-Fi", "Science Fiction").ReplaceAll(" and ", " & ") Next End If // Remove empties, and add to genres For i as Integer = 0 to tmpArray.Ubound If Trim( tmpArray(i) ) <> "" Then TVAttr.Genres.Append tmpArray(i) Next TVAttr.Genres = RemoveDuplicatesFromArray( TVAttr.Genres ) // Apparantly, boxee only supports uppercase genres? If Prefs.stringForKey("MediaPlayer") = "Boxee" Then For i as Integer = 0 to TVAttr.Genres.Ubound TVAttr.Genres(i) = TVAttr.Genres(i).Uppercase Next End If // ## Studios If TVDB <> Nil And TVDB.HasName("Network") And TVDB.Value("Network") <> "" Then TVAttr.TVNetwork = TVDB.Value("Network") If IMDb <> Nil And IMDb.HasName("STUDIOS") Then For i as Integer = 0 to IMDb.Child("STUDIOS").Count - 1 TVAttr.Studios.Append IMDb.Child("STUDIOS").Value(i) Next End If // ## Country If IMDb <> Nil And IMDb.HasName("COUNTRY") Then For i as Integer = 0 to IMDb.Child("COUNTRY").Count - 1 TVAttr.Countries.Append IMDb.Child("COUNTRY").Value(i) Next End If TVAttr.Countries = RemoveDuplicatesFromArray( TVAttr.Countries ) // ## Language If IMDb <> Nil And IMDb.HasName("LANGUAGE") Then For i as Integer = 0 to IMDb.Child("LANGUAGE").Count - 1 TVAttr.Languages.Append IMDb.Child("LANGUAGE").Value(i) Next End If // ## Recommendations If Prefs.stringForKey("MediaPlayer") <> "YAMJ" And Prefs.boolForKey("GetRecommendations") Then If IMDb <> Nil And IMDb.HasName("RECOMMENDATIONS") And IMDb.Child("RECOMMENDATIONS").IsArray And IMDb.Child("RECOMMENDATIONS").Count > 0 Then For i as Integer = 0 to IMDb.Child("RECOMMENDATIONS").Count - 1 Dim RecTitle as String = Trim( RegExThis( IMDb.Child("RECOMMENDATIONS").Value(i), "\[.*\]", "" ) ) Dim RecID as String = Trim( RegExThis( IMDb.Child("RECOMMENDATIONS").Value(i), ".*\[", "" ) ).ReplaceAll("]","") If RecTitle = "" Then RecTitle = Loc.kNotAvailable TVAttr.RecShows.Append RecTitle TVAttr.RecShow_IDs.Append RecID Next End If End If // ## Director(s) If IMDb <> Nil And IMDb.HasName("DIRECTORS") Then For i as Integer = 0 to IMDb.Child("DIRECTORS").Count - 1 If TVAttr.CreditDirector = "" Then TVAttr.CreditDirector = IMDb.Child("DIRECTORS").Value(i) Else TVAttr.CreditDirector = TVAttr.CreditDirector + ", " + IMDb.Child("DIRECTORS").Value(i) End If Next End If // ## Writer(s) If IMDb <> Nil And IMDb.HasName("WRITERS") Then For i as Integer = 0 to IMDb.Child("WRITERS").Count - 1 If TVAttr.CreditWriter = "" Then TVAttr.CreditWriter = IMDb.Child("WRITERS").Value(i) Else TVAttr.CreditWriter = TVAttr.CreditWriter + ", " + IMDb.Child("WRITERS").Value(i) End If Next End If // ## Actors Starring If IMDb <> Nil And IMDb.HasName("STARS") Then For i as Integer = 0 to IMDb.Child("STARS").Count - 1 TVAttr.ActorStars.Append IMDb.Child("STARS").Value(i) Next End If // ## Actors // -- Prefer IMDb over TVDB If IMDb <> Nil And IMDb.HasName("CAST") And IMDb.HasName("ROLES") ANd IMDb.HasName("CASTTHUMBS") Then For i as Integer = 0 to IMDb.Child("CAST").Count -1 // If only one item, arrayify it. If TVDBActors <> Nil And TVDBActors.HasName("Actor") And NOT TVDBActors.Child("Actor").IsArray Then Dim jItem as New JSONItem jItem = TVDBActors.Child("Actor") TVDBActors.Value("Actor") = New JSONItem TVDBActors.Child("Actor").Value(0) = jItem End If // Match names with TVDB ID's If TVDBActors <> Nil And TVDBActors.HasName("Actor") Then Dim b as Boolean = False For n as Integer = 0 to TVDBActors.Child("Actor").Count -1 If TVDBActors.Child("Actor").Child(n).Value("Name") = IMDb.Child("CAST").Value(i) Then TVAttr.Actor_ID.Append TVDBActors.Child("Actor").Child(n).Value("id") b = True Exit End If Next If NOT b Then TVAttr.Actor_ID.Append "" Else TVAttr.Actor_ID.Append "" End If TVAttr.Actor_Name.Append trim( IMDb.Child("CAST").Value(i) ) TVAttr.Actor_Role.Append Trim( IMDb.Child("ROLES").Value(i) ) TVAttr.Actor_ThumbURL.Append IMDb.Child("CASTTHUMBS").Value(i) Next ElseIf TVDBActors <> Nil And TVDBActors.HasName("Actor") And TVDBActors.Child("Actor").IsArray Then For i as Integer = 0 To TVDBActors.Child("Actor").Count - 1 Dim jItem as New JSONItem jItem = TVDBActors.Child("Actor").Child(i) If jItem.HasName("id") Then TVAttr.Actor_ID.Append jItem.Value("id") Else TVAttr.Actor_ID.Append "" If jItem.HasName("Name") Then TVAttr.Actor_Name.Append jItem.Value("Name") Else TVAttr.Actor_Name.Append "" If jItem.HasName("Role") Then TVAttr.Actor_Role.Append jItem.Value("Role") Else TVAttr.Actor_Role.Append "" If jItem.HasName("Image") And jItem.Value("Image") <> "" Then TVAttr.Actor_ThumbURL.Append TVCore.GraphicsPath + jItem.Value("Image") Else TVAttr.Actor_ThumbURL.Append "" Next End If // Write NFO TVAttr.NFOWrite( TVAttr.FolderParent ) // 18: Get Episode Info TVCore.EpisodeUpdate( TVAttr.ID_TVDB ) // 19: Auto Manage TV Shows Folder If NOT CommonCore.MassSearch And Prefs.boolForKey("AutoManageMedia") Then SingleRenamer( TVAttr.FolderParent, -1, True ) // 20: Download ExtraArt GetArt( TVDBArt, FanartTVJSON ) // 20: Write NFO file. If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kMetadata + ":", Loc.kWritingNFO ) Else dlgProgress.debug( Loc.kWritingNFO ) TVAttr.NFOWrite( TVAttr.FolderParent ) // Copy file to "folder.jpg". Dim FolderIMG as FolderItem Select Case Prefs.stringForKey( "FolderJPGForFileTV" ) Case Loc.kPoster FolderIMG = TVAttr.FolderParent.Child("poster.jpg") Case Loc.kBanner FolderIMG = TVAttr.FolderParent.Child("banner.jpg") Case Loc.kLogo FolderIMG = TVAttr.FolderParent.Child("logo.png") Case Loc.kClearArt FolderIMG = TVAttr.FolderParent.Child("clearart.png") Case Loc.kCharacterArt FolderIMG = TVAttr.FolderParent.Child("character.png") Case Loc.kThumb FolderIMG = TVAttr.FolderParent.Child("landscape.jpg") End Select If FolderIMG <> Nil And FolderIMG.Exists Then FolderIMG.CopyFileTo( TVAttr.FolderParent.Child( "folder" + "." + FolderIMG.Extension ) ) // Download actor images. If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kDownloading + ":", Loc.kActorThumbs + "..." ) Else dlgProgress.Debug( Loc.kDownloading + " " + Loc.kActorThumbs + "..." ) If Prefs.boolForKey("AutoDownloadActorThumbs") Then If NOT TVAttr.FolderParent.Child(".actors").Exists Then TVAttr.FolderParent.Child(".actors").CreateAsFolder If SymLink( TVAttr.FolderParent.Child( ".actors" ), TVAttr.FolderParent.Child( "actors" ) ) Then // Created symlink End If Dim ActorFolder as FolderItem = TVAttr.FolderParent.Child(".actors") If ActorFolder = Nil OR NOT ActorFolder.Exists Then ActorFolder = TVAttr.FolderParent.Child("actors") Dim Max as Integer = TVAttr.Actor_ThumbURL.Ubound If Prefs.integerForKey( "MaxActors" ) > 0 And Prefs.integerForKey("MaxActors") <= Max Then Max = Prefs.integerForKey("MaxActors") If ActorFolder <> Nil And ActorFolder.Exists Then For i as Integer = 0 to Max Dim ActorFile as FolderItem = ActorFolder.Child( TVAttr.Actor_Name(i).ReplaceAll(":", "_").ReplaceAll(" ", "_") + ".jpg" ) If TVAttr.Actor_ThumbURL(i) <> "" And TVAttr.Actor_Name(i) <> "" And NOT ActorFile.Exists Then dlgProgress.Debug( Loc.kDownloading + " " + Str( i + 1 ) + Loc.k1of2 + Str( Max + 1 ) + " " + TVAttr.Actor_Name(i) + " " + Loc.kThumb.Lowercase + "..." ) dim data as string = sckt.Get( TVAttr.Actor_ThumbURL(i), TimeOut ) if data.Contains("

ERROR

") then 'Break elseif data <> "" then 'If Sckt.Get( TVAttr.Actor_ThumbURL(i), ActorFile, TimeOut ) Then 'TVAttr.Actor_ThumbURL(i) = ActorFile.ShellPath.ReplaceAll( "\", "" ) 'Else 'Sckt.Close 'If ActorFile IsA FolderItem Then ActorFile.Delete 'End If 'Sckt.Close URL2Picture( TVAttr.Actor_ThumbURL(i), ActorFile.Parent, ActorFile.Name ) if ActorFile <> Nil and ActorFile.Exists then TVAttr.Actor_ThumbURL(i) = ActorFile.ShellPath.ReplaceAll("\", "") end if end if // @END data.Contains("

ERROR

") ElseIf ActorFile.Exists Then TVAttr.Actor_ThumbURL(i) = ActorFile.ShellPath.ReplaceAll( "\", "" ) End If Next End If dlgProgress.Debug "" End If TVAttr.NFOWrite( TVAttr.FolderParent ) dlgProgress.Debug( "" ) Return End Sub #tag EndMethod #tag Method, Flags = &h0 Function IMDb2TVDB(IMDbID as String) As String Dim Sckt as New TVDBSckt If IMDbID.Left(2) = "tt" Then Dim XMLString as String = DefineEncoding( sckt.Get( TVCore.URL( "InfoAlias", IMDbID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'JSONString = JSONString.XML2JSON Dim TVDBAlias as New JSONItem 'If JSONString.ValidJSON("TVDB Alias") Then TVDBAlias.Load JSONString TVDBAlias = XMLString.XML2JSON If TVDBAlias = Nil Then Return "" If TVDBAlias.HasName("Data") And TVDBAlias.ToString.InStr( 0, "Series" ) > 0 And TVDBAlias.Child("Data").HasName("Series") And TVDBAlias.Child("Data").Child("Series").HasName("id") Then Return TVDBAlias.Child("Data").Child("Series").Value("id") Else Return IMDbID End If Else Return IMDbID End If End Function #tag EndMethod #tag Method, Flags = &h0 Function ProcessEpGuide(XMLString as String, SeriesID as String) As JSONItem Dim Info as String = "ProcessEpGuide( XMLString, " + SeriesID + " ) - " App.ErrorMessage = Info + XMLString If XMLString.InStr( 0, " 0 Then Return Nil App.ErrorMessage = Info + "Create destination" XMLString = XMLString.ReplaceAll( XMLString.MyMid( "", "" ), "" ).ReplaceAll( "", "" ) Dim Destination as FolderItem = Preferences.fAppSupport.Child( "EpisodeGuides" ) If Destination <> Nil And NOT Destination.Exists Then Destination.CreateAsFolder 'Dim JSONString as String = XMLString.XML2JSON If Destination <> Nil Then If Destination.Child( SeriesID + ".json" ).Exists Then Destination.Child( SeriesID + ".json" ).MoveFileTo( TVAttr.FolderParent.Child( "EpisodeGuide.json" ) ) Else Return Nil End If Destination = TVAttr.FolderParent App.ErrorMessage = Info + "Load the old guide" // ## Load the old guide. dlgProgress.Debug ( Loc.kReadingInfo + ": " + Loc.kEpisodeGuide.Lowercase ) Dim OldGuide as New JSONItem Dim JSONString as String = ReadTextFile( Destination.Child( "EpisodeGuide.json" ) ) If JSONString <> "" Then OldGuide.Load( JSONString ) If OldGuide <> Nil And OldGuide.HasName("episodes") Then OldGuide = OldGuide.Child("episodes") If OldGuide <> Nil And NOT OldGuide.IsArray Then App.ErrorMessage = Info + "Turn the old guide into an array" Dim Daddy as New JSONItem Daddy.Child(0) = OldGuide OldGuide = Daddy End If App.ErrorMessage = Info + "Set the new guide" // ## Set the New Guide. Dim NewGuide as New JSONItem 'NewGuide.Load( XMLString.ReplaceAll("\","").XML2JSON ) If XMLString <> "" Then NewGuide = XMLString.XML2JSON If NewGuide = Nil OR Len( NewGuide.ToString ) < 100 Then Return Nil If NewGuide <> Nil And NewGuide.HasName("Data") And NewGuide.ToString.InStr( 0, """Episode""" ) > 0 And NewGuide.Child("Data").HasName("Episode") Then NewGuide = NewGuide.Child("Data").Child("Episode") // If only a single episode was available, re-convert guide to Array. If NOT NewGuide.IsArray Then App.ErrorMessage = Info + "Turn new guide into array" Dim Daddy as New JSONItem Daddy.Child(0) = NewGuide NewGuide = Daddy End If App.ErrorMessage = Info + "Create Update-Guide" Dim UpdatedGuide as New JSONItem UpdatedGuide.Value( "episodes" ) = New JSONItem If NOT CommonCore.MassSearch Then dlgProgress.Reset For i as Integer = 0 to NewGuide.Count -1 App.ErrorMessage = Info + "UpdateGuide JSONItem( " + Str( i ) + " of " + Str( NewGuide.Count -1 ) + " )" dlgProgress.Debug( Loc.kProcessing + " " + Str( i + 1 ) + Loc.k1of2 + Str( NewGuide.Count ) + " " + Loc.kEpisodes.Lowercase ) Dim OldEpisodeData as New JSONItem, NewEpisodeData as New JSONItem, UpdateEpisodeData as New JSONItem NewEpisodeData = NewGuide.Child(i) // Match OldEpisde to New Episode If NewEpisodeData.HasName("SeasonNumber") And NewEpisodeData.HasName("EpisodeNumber") Then For n as Integer = 0 to OldGuide.Count -1 OldEpisodeData = OldGuide.Child(n) If OldEpisodeData.HasName("SeasonNumber") And OldEpisodeData.Value("SeasonNumber") = NewEpisodeData.Value("SeasonNumber") And _ OldEpisodeData.HasName("EpisodeNumber") And OldEpisodeData.Value("EpisodeNumber") = NewEpisodeData.Value("EpisodeNumber") Then Exit End If OldEpisodeData = Nil Next 'If OldEpisodeData = Nil Then OldEpisodeData.Load( "" ) End If Dim dSeason, dEpisode as String If NewEpisodeData.HasName("SeasonNumber") Then dSeason = NewEpisodeData.Value("SeasonNumber") If NewEpisodeData.HasName("EpisodeNumber") Then dEpisode = NewEpisodeData.Value("EpisodeNumber") If dSeason.len = 1 Then dSeason = "0" + dSeason If dEpisode.len = 1 Then dEpisode = "0" + dEpisode If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kEpisodeGuide + ":", "S" + dSeason + "E" + dEpisode + " - " + ReplaceAll( NewEpisodeData.Value("EpisodeName"), "&", "&" ), 1, NewGuide.Count ) Else dlgProgress.Debug( Loc.kEpisodeGuide + ": " + "S" + dSeason + "E" + dEpisode + " - " + ReplaceAll( NewEpisodeData.Value("EpisodeName"), "&", "&" ) ) End If UpdateEpisodeData.Value("id") = NewEpisodeData.Value("id") UpdateEpisodeData.Value("IMDB_ID") = NewEpisodeData.Value("IMDB_ID") UpdateEpisodeData.Value("seasonid") = NewEpisodeData.Value("seasonid") UpdateEpisodeData.Value("EpisodeName") = ReplaceAll( NewEpisodeData.Value("EpisodeName"), "&", "&" ) UpdateEpisodeData.Value("SeasonNumber") = NewEpisodeData.Value("SeasonNumber") UpdateEpisodeData.Value("EpisodeNumber") = NewEpisodeData.Value("EpisodeNumber") UpdateEpisodeData.Value("DVDSeason") = NewEpisodeData.Value("DVD_season") UpdateEpisodeData.Value("DVDEpisode") = NewEpisodeData.Value("DVD_episodenumber") UpdateEpisodeData.Value("AbsoluteNumber") = NewEpisodeData.Value("absolute_number") // Get episode IMDB data if possible, and episode hasn't been watched yet. Dim IMDbEpisode as New JSONItem If UpdateEpisodeData.Value("IMDB_ID") <> "" Then If ( OldEpisodeData <> Nil And OldEpisodeData.HasName("IMDB_ID") And OldEpisodeData.Value("IMDB_ID") = "" ) OR _ UpdateEpisodeData.HasName("Runtime") And UpdateEpisodeData.Value("Runtime") = True OR _ OldEpisodeData = Nil OR _ ( OldEpisodeData <> Nil And OldEpisodeData.HasName("Cast") And OldEpisodeData.Child("Cast").Count = 0 ) OR _ ( OldEpisodeData <> Nil And OldEpisodeData.HasName("plot") And OldEpisodeData.Value("plot") = "" ) Then 'IMDbEpisode = GetIMDbJSON( UpdateEpisodeData.Value("IMDB_ID"), True ) End If End If // Special deliveries If NewEpisodeData.HasName("airsbefore_season") Then UpdateEpisodeData.Value("airsafter_season") = NewEpisodeData.Value("airsafter_season") 'If NewEpisodeData.Value("airsafter_season") = "" And NewEpisodeData.Value("airsbefore_season") > 0 Then UpdateEpisodeData.Value("airsafter_season") = NewEpisodeData.Value("airsbefore_season") - 1 UpdateEpisodeData.Value("airsbefore_season") = NewEpisodeData.Value("airsbefore_season") 'If NewEpisodeData.Value("airsbefore_season") = "" And NewEpisodeData.Value("airsafter_season") > 0 Then UpdateEpisodeData.Value("airsbefore_season") = NewEpisodeData.Value("airsafter_season") + 1 If NewEpisodeData.HasName("airsbefore_episode") And NewEpisodeData.Value("airsbefore_episode") <> "" Then UpdateEpisodeData.Value("airsbefore_episode") = NewEpisodeData.Value("airsbefore_episode") Else UpdateEpisodeData.Value("airsbefore_episode") = "4096" End If End If If OldEpisodeData <> Nil And OldEpisodeData.HasName("airsafterseason") Then UpdateEpisodeData.Value("airsafterseason") = OldEpisodeData.Value("airsafterseason") UpdateEpisodeData.Value("airsbeforeseason") = OldEpisodeData.Value("airsbeforeseason") UpdateEpisodeData.Value("airsbeforeepisode") = OldEpisodeData.Value("airsbeforeepisode") End If // AirDate UpdateEpisodeData.Value("FirstAired") = NewEpisodeData.Value("FirstAired") // Runtime If OldEpisodeData <> Nil And OldEpisodeData.HasName("Runtime") Then UpdateEpisodeData.Value("Runtime") = OldEpisodeData.Value("Runtime") If IMDbEpisode <> Nil And IMDbEpisode.HasName("RUNTIME") Then UpdateEpisodeData.Value("Runtime") = IMDbEpisode.Value("RUNTIME") // Fix a bug I made If UpdateEpisodeData.HasName("Runtime") And UpdateEpisodeData.Value("Runtime") = True Then UpdateEpisodeData.Remove("Runtime") // Rating UpdateEpisodeData.Value("Rating") = NewEpisodeData.Value("Rating") If OldEpisodeData <> Nil And OldEpisodeData.HasName("Rating") And OldEpisodeData.Value("Rating") <> "" Then UpdateEpisodeData.Value("Rating") = OldEpisodeData.Value("Rating") If IMDbEpisode <> Nil And IMDbEpisode.HasName("RATING") Then UpdateEpisodeData.Value("Rating") = IMDbEpisode.Value("RATING") UpdateEpisodeData.Value("Votes") = NewEpisodeData.Value("RatingCount") If IMDbEpisode <> Nil And IMDbEpisode.HasName("VOTES") Then UpdateEpisodeData.Value("Votes") = IMDbEpisode.Value("VOTES") // Watched status If OldEpisodeData <> Nil And OldEpisodeData.HasName("watched") And OldEpisodeData.Value("watched") <> "" Then UpdateEpisodeData.Value("watched") = OldEpisodeData.Value("watched") Else UpdateEpisodeData.Value("watched") = False End If // Description // -- Outline 'UpdateEpisodeData.Value("outline") = "" 'If IMDbEpisode <> Nil And IMDbEpisode.HasName("PLOT") Then UpdateEpisodeData.Value("outline") = IMDbEpisode.Value("PLOT") // -- Plot UpdateEpisodeData.Value("plot") = "" 'If NewEpisodeData.Child("Overview").IsArray Then MessageBox "Array" If NewEpisodeData.HasName("Overview") And NOT NewEpisodeData.Value("Overview").IsArray Then UpdateEpisodeData.Value("plot") = Trim( NewEpisodeData.Value("Overview") ) If UpdateEpisodeData.Value("plot") = "" And IMDbEpisode <> Nil And IMDbEpisode.HasName("STORYLINE") And Trim( IMDbEpisode.Value("STORYLINE") ) <> "" Then // IMDb Backup UpdateEpisodeData.Value("plot") = Trim( IMDbEpisode.Value("STORYLINE").ReplaceAll("»", "") ) End If 'If IMDbEpisode <> Nil And IMDbEpisode.HasName("STORYLINE") And Trim( IMDbEpisode.Value("STORYLINE") ) <> "" And _ ' IMDbEpisode.Value("STORYLINE").InStr( 0, "»" ) = 0 And _ '( NOT UpdateEpisodeData.HasName("Plot") OR UpdateEpisodeData.Value("Plot") = "" ) Then 'If Trim( IMDbEpisode.Value("STORYLINE").ReplaceAll("»", "") ) <> "" Then UpdateEpisodeData.Value("plot") = Trim( IMDbEpisode.Value("STORYLINE").ReplaceAll("»", "") ) 'End If // Thumb UpdateEpisodeData.Value("filename") = "" If NewEpisodeData.HasName("filename") And NewEpisodeData.Value("filename") <> "" Then UpdateEpisodeData.Value("filename") = TVCore.GraphicsPath + NewEpisodeData.Value("filename") // Doesn't give good results: 'If IMDbEpisode <> Nil And IMDbEpisode.HasName("POSTER_FULL") And IMDbEpisode.Value("POSTER_FULL") <> "" Then 'UpdateEpisodeData.Value("filename") = IMDbEpisode.Value("POSTER_FULL").ReplaceAll("_V1._SY0.", "_V1._SY750.") 'End If UpdateEpisodeData.Value("poster") = "" If IMDbEpisode <> Nil And IMDbEpisode.HasName( "POSTER_LARGE" ) Then UpdateEpisodeData.Value("poster") = IMDbEpisode.Value("POSTER_LARGE") // #Credits // - Directors Dim Directors as String = NewEpisodeData.Value("Director") If Directors.Left(1) = "|" Then Directors = Directors.Right( Directors.Len - 1 ) If Directors.Right(1) = "|" Then Directors = Directors.Left( Directors.Len - 1 ) Directors = Directors.ReplaceAll("|", ", ") UpdateEpisodeData.Value( "director" ) = Trim( Directors ) // - Writers Dim Writers as String = NewEpisodeData.Value("Writer") If Writers.Left(1) = "|" Then Writers = Writers.Right( Writers.Len - 1 ) If Writers.Right(1) = "|" Then Writers = Writers.Left( Writers.Len - 1 ) Writers = Writers.ReplaceAll("|", ", ") UpdateEpisodeData.Value( "credits" ) = Trim( Writers ) // - Guest Stars Dim GuestStars as String = NewEpisodeData.Value("GuestStars") If GuestStars.Left(1) = "|" Then GuestStars = GuestStars.Right( GuestStars.Len - 1 ) If GuestStars.Right(1) = "|" Then GuestStars = GuestStars.Left( GuestStars.Len - 1 ) GuestStars = GuestStars.ReplaceAll("|", ", ") UpdateEpisodeData.Value( "guests" ) = Trim( GuestStars ) // - Actors 'UpdateEpisodeData.Value("Cast") = New JSONItem 'UpdateEpisodeData.Value("Roles") = New JSONItem 'UpdateEpisodeData.Value("CastThumbs") = New JSONItem // Download IMDB data. 'If IMDbEpisode <> Nil And IMDbEpisode.HasName("CAST") Then 'For n as Integer = 0 to IMDbEpisode.Child("CAST").Count -1 'UpdateEpisodeData.Child("Cast").Value(n) = IMDbEpisode.Child("CAST").Value(n) 'UpdateEpisodeData.Child("Roles").Value(n) = IMDbEpisode.Child("ROLES").Value(n) 'UpdateEpisodeData.Child("CastThumbs").Value(n) = IMDbEpisode.Child("CASTTHUMBS").Value(n) 'Next ' 'ElseIf OldEpisodeData <> Nil And OldEpisodeData.HasName("Cast") Then 'UpdateEpisodeData.Child("Cast") = OldEpisodeData.Child("Cast") 'UpdateEpisodeData.Child("Roles") = OldEpisodeData.Child("Roles") 'UpdateEpisodeData.Child("CastThumbs") = OldEpisodeData.Child("CastThumbs") 'Else 'For n as Integer = 0 to TVAttr.Actor_Name.Ubound 'UpdateEpisodeData.Child("Cast").Value(n) = TVAttr.Actor_Name(n) 'UpdateEpisodeData.Child("Roles").Value(n) = TVAttr.Actor_Role(n) 'UpdateEpisodeData.Child("CastThumbs").Value(n) = TVAttr.Actor_ThumbURL(n) 'Next 'End If // Download actor thumbnails 'If Prefs.boolForKey("AutoDownloadActorThumbs") Then 'If NOT TVAttr.FolderParent.Child("actors").Exists Then TVAttr.FolderParent.Child("actors").CreateAsFolder 'For n as Integer = 0 to UpdateEpisodeData.Child("CastThumbs").Count -1 'Dim URL as String = Trim( UpdateEpisodeData.Child("CastThumbs").Value(n) ) 'Dim Name as String = Trim( UpdateEpisodeData.Child("Cast").Value(n) ) ' 'If URL = "" OR URL.Left(4) <> "http" OR Name = "" OR TVAttr.FolderParent.Child("actors").Child( Name + ".jpg" ).Exists Then Continue ' 'Dim sckt as New TVDBSckt 'If sckt.Get( URL, TVAttr.FolderParent.Child("actors").Child( Name + ".jpg" ), Prefs.integerForKey("TimeOut") ) Then 'UpdateEpisodeData.Child("CastThumbs").Value(n) = TVAttr.FolderParent.Child("actors").Child( Name + ".jpg" ).ShellPath.ReplaceAll("\","") 'End If 'sckt.Close ' 'Next 'End If UpdatedGuide.Child("episodes").Append UpdateEpisodeData UpdatedGuide.Compact = False Next dlgProgress.Debug "" 'UpdatedGuide.Compact = True // ## Write EpGuide to Disk. WriteTextFile( UpdatedGuide.ToString, Destination.Child( "EpisodeGuide.json" ) ) If UpdatedGuide.HasName("episodes") Then Return UpdatedGuide.Child("episodes") Else Return UpdatedGuide End If End Function #tag EndMethod #tag Method, Flags = &h0 Sub ProcessEpisodes(XMLString as String) 'If XMLString.InStr( "Website is currently unreachable" ) > 0 Then 'MessageBox MovieCore.kServiceUnavailable + chr(13) + chr(13) + Loc.kPleaseTryAgainLater 'Return 'End If If XMLString.ValidJSON( "TVDB EpGuide", true ) Then Return If XMLString = "" OR XMLString.InStr( "" ) > 0 Then Return App.ErrorMessage = "Let's start!" Dim ID as String = XMLString.MyMid( "", "" ) ID = ID.MyMid( "","" ) Dim SeriesName as String = XMLString.MyMid( "", "" ) Dim EpisodeGuide as New JSONItem If XMLString <> "" And ID <> "" Then EpisodeGuide = ProcessEpGuide( XMLString, ID ) Else Return XMLString = "" 'If Prefs.boolForKey("SkipEpisodeFiles") Then Return // The user has chosen not to manage episode files. Dim EpisodeFiles() as FolderItem = FindEpisodeFiles( TVAttr.FolderParent ) Dim CurrentEpisode as FolderItem If NOT CommonCore.MassSearch Then dlgProgress.Reset If EpisodeFiles = Nil Then Return Dim CurrentItem as FolderItem 'dlgProgress.Reset dlgProgress.Add( Loc.kSearching + ":", Loc.kEpisodeFiles ) For i as Integer = 0 to EpisodeFiles.Ubound App.ErrorMessage = "EpisodeFiles(" + Str( i ) + ") of (" + Str( EpisodeFiles.Ubound ) + ")" 'dlgProgress.Add( Loc.kProcessing + ":", EpisodeFiles(i).NameNoExtension, 1, EpisodeFiles.Ubound ) If EpisodeFiles(i) = Nil OR NOT EpisodeFiles(i).Exists Then Continue CurrentItem = EpisodeFiles(i) Dim Parent as FolderItem = CurrentItem.Parent // Read previous NFO file. Dim NFOFile as FolderItem = Parent.Child( CurrentItem.NameNoExtension + ".nfo" ) // Continue if there's already an .nfo and thumbnail file. Dim ImageFile as FolderItem If ( Parent.Child( CurrentItem.NameNoExtension + ".jpg" ).Exists OR _ Parent.Child( CurrentItem.NameNoExtension + ".tbn" ).Exists OR _ Parent.Child( CurrentItem.NameNoExtension + "-thumb.jpg" ).Exists OR _ Parent.Child( CurrentItem.NameNoExtension + "-videoimage.jpg" ).Exists ) And _ NFOFile <> Nil And NFOFile.Exists Then Continue End If Dim ExistingNFO as New JSONItem If NFOFile <> Nil And NFOFile.Exists Then CurrentEpisode = EpisodeFiles(i) Dim s as String = ReadTextFile( NFOFile ) 'Dim JSONString as String = ReadTextFile( NFOFile ).XML2JSON 'If JSONString <> "" Then ExistingNFO.Load JSONString If Trim( s ).InStr( 0, " 0 Then ExistingNFO = ReadTextFile( NFOFile ).XML2JSON 'If Trim( s ).Contains("","") <> "" Then Continue If ExistingNFO <> Nil And ExistingNFO.HasName("episodedetails") Then ExistingNFO = ExistingNFO.Child("episodedetails") End If // Check the EpisodeGuide and match it with the current episode. Dim OOxOO as String = RegExEpisode( EpisodeFiles(i) ) If OOxOO.InStr( "-" ) > 0 Then Continue // Negative values are no good. Dim SeasonNr, Season as Integer = Val( OOxOO.NthField( "x", 1 ) ) Dim EpisodeNr as Integer = Val( OOxOO.NthField( "x", 2 ) ) // Multi part episodes Dim Episodes() as String = OOxOO.Split("x") Dim MultiEpisode() as JSONItem If Episodes.Ubound >= 2 Then For n as Integer = 1 to Episodes.Ubound App.ErrorMessage = App.ErrorMessage + chr(13) + "MultiEpisodes(" + Str( n ) + ") of (" + Str( Episodes.Ubound ) + ") " + OOxOO 'EpisodeNrs.Append Episodes(i) Dim CurrentEpisodeNr as String = Str( Val( Episodes(n) ) ) Dim EpisodeName as String = Loc.kNotAvailable If EpisodeGuide <> Nil And EpisodeGuide.Count > 0 Then For t as Integer = 0 to EpisodeGuide.Count -1 Dim ThisEpisode as New JSONItem ThisEpisode = EpisodeGuide.Child(t) If ThisEpisode.HasName("SeasonNumber") And Str( ThisEpisode.Value("SeasonNumber") ) = Str( SeasonNr ) Then If ThisEpisode.HasName("EpisodeNumber") And Str( ThisEpisode.Value("EpisodeNumber") ) = CurrentEpisodeNr Then MultiEpisode.Append ThisEpisode If ThisEpisode.HasName("EpisodeName") Then EpisodeName = ReplaceAll( ThisEpisode.Value("EpisodeName"), "&", "&" ) Exit End If End If ThisEpisode = Nil Next End If 'For t as Integer = 0 to EpisodeGuide.Count -1 ''App.ErrorMessage = App.ErrorMessage + chr(13) + "EpisodeGuide(" + Str( t ) + ") of (" + Str( EpisodeGuide.Count - 1 ) + ")" 'Dim ThisEpisode as New JSONItem 'ThisEpisode = EpisodeGuide.Child(t) ' ''If TRUE Then // Absolute order ' 'If ThisEpisode.HasName("SeasonNumber") And Val( ThisEpisode.Value("SeasonNumber") ) = SeasonNr And _ 'ThisEpisode.HasName("EpisodeNumber") And Val( ThisEpisode.Value("EpisodeNumber") ) = Val( EpisodeNrs ) Then 'MultiEpisode.Append ThisEpisode 'If ThisEpisode.HasName("EpisodeName") Then EpisodeName = ThisEpisode.Value("EpisodeName") 'Exit 'End If ' ''Else // DVD order '' ''Dim DVDSeason, DVDEpisode as Integer ''If ThisEpisode.HasName("DVD_season") And ThisEpisode.Value("DVD_season") <> "" Then ''DVDSeason = ThisEpisode.Value("DVD_season") ''ElseIf ThisEpisode.HasName("SeasonNumber") Then ''DVDSeason = ThisEpisode.Value("SeasonNumber") ''End If '' ''If ThisEpisode.HasName("DVD_episodenumber") And ThisEpisode.Value("DVD_episodenumber") <> "" Then ''DVDEpisode = ThisEpisode.Value("DVD_episodenumber") ''ElseIf ThisEpisode.HasName("EpisodeNumber") Then ''DVDEpisode = ThisEpisode.Value("EpisodeNumber") ''End If '' ''If DVDSeason = SeasonNr And DVDEpisode = Val( EpisodeNrs ) Then ''MultiEpisode.Append ThisEpisode ''Exit ''End If '' ''End If ' 'ThisEpisode = Nil 'Next // Display progress information. 'Dim SeasonDisplay as String = Str( SeasonNr ) 'If SeasonDisplay.Len = 1 Then SeasonDisplay = "0" + SeasonDisplay 'Dim EpisodeDisplay as String = Str( Episodes(n) ) 'If EpisodeDisplay.Len = 1 Then EpisodeDisplay = "0" + EpisodeDisplay App.ErrorMessage = App.ErrorMessage + chr(13) + "Show drogress dialog" If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kEpisodes + ":", "S" + LeadingZero( SeasonNr ) + "E" + LeadingZero( Val( Episodes(n) ) ) + " - " + EpisodeName, 1, EpisodeGuide.Count ) Else dlgProgress.Debug( "S" + LeadingZero( SeasonNr ) + "E" + LeadingZero( Val( Episodes(n) ) ) + " - " + EpisodeName ) End If Next App.ErrorMessage = "Multi-Episode Fault writing NFO" If MultiEpisode.Ubound > -1 Then EpisodeFiles(i) = TVAttr.EpisodeNFO( Nil, EpisodeFiles(i), MultiEpisode ) End If Else 'If EpisodeNrs.Ubound = 3 If SeasonNr = -1 Then SeasonNr = 1 If ExistingNFO <> Nil And ExistingNFO.HasName("season") And ExistingNFO.Value("season") <> "" Then SeasonNr = ExistingNFO.Value("season") If ExistingNFO <> Nil And ExistingNFO.HasName("episode") And ExistingNFO.Value("episode") <> "" Then EpisodeNr = ExistingNFO.Value("episode") // Match episode to episodeguide NFO. Dim ThisEpisode as New JSONItem If EpisodeGuide = Nil Then Continue For n as Integer = 0 to EpisodeGuide.Count -1 App.ErrorMessage = App.ErrorMessage + chr(13) + "EpisodeGuide(" + Str( n ) + ") of (" + Str( EpisodeGuide.Count - 1 ) + ")" ThisEpisode = EpisodeGuide.Child(n) If ThisEpisode.HasName("SeasonNumber") And Val( ThisEpisode.Value("SeasonNumber") ) = SeasonNr And _ ThisEpisode.HasName("EpisodeNumber") And Val( ThisEpisode.Value("EpisodeNumber") ) = EpisodeNr Then Exit ThisEpisode = Nil Next If ThisEpisode = Nil Then Continue // Display progress information. Dim SeasonDisplay as String = Str( SeasonNr ) 'If SeasonDisplay.Len = 1 Then SeasonDisplay = "0" + SeasonDisplay Dim EpisodeDisplay as String = Str( EpisodeNr ) 'If EpisodeDisplay.Len = 1 Then EpisodeDisplay = "0" + EpisodeDisplay If NOT CommonCore.MassSearch Then dlgProgress.Add( Loc.kEpisodes + ":", "S" + LeadingZero( SeasonNr ) + "E" + LeadingZero( EpisodeNr ) + " - " + ThisEpisode.Value("EpisodeName"), 1, EpisodeGuide.Count ) Else dlgProgress.Debug( "S" + LeadingZero( SeasonNr ) + "E" + LeadingZero( EpisodeNr ) + " - " + ThisEpisode.Value("EpisodeName") ) End If App.ErrorMessage = "Single-Episode fault writing NFO" EpisodeFiles(i) = TVAttr.EpisodeNFO( ThisEpisode, EpisodeFiles(i) ) End If If MultiEpisode.Ubound <= -1 Then Continue Next dlgProgress.Debug "" App.ErrorMessage = "" Exception err as XmlException Dim w as New wndBugReporter If CurrentEpisode <> Nil Then w.Init( err, CurrentEpisode.Parent.ShellPath.ReplaceAll("\","") + "/" + CurrentEpisode.NameNoExtension + ".nfo" + chr( 13 ) + App.ErrorMessage ) ElseIf CurrentItem <> Nil Then w.Init( err, CurrentItem.Name + chr( 13 ) + App.ErrorMessage) Else w.Init( err, chr( 13 ) + App.ErrorMessage ) End If Return Exception err as OutOfBoundsException Dim w as New wndBugReporter If CurrentEpisode <> Nil Then w.Init( err, CurrentEpisode.Parent.ShellPath.ReplaceAll("\","") + "/" + CurrentEpisode.NameNoExtension + ".nfo" + chr( 13 ) + App.ErrorMessage ) ElseIf CurrentItem <> Nil Then w.Init( err, TVAttr.Title + Chr(13) + CurrentItem.Name + chr( 13 ) + App.ErrorMessage ) ELse w.Init( err, chr( 13 ) + App.ErrorMessage ) End If Return 'MessageBox "Xml Exception ERROR " + Str( err.ErrorNumber ) + EndOfLine _ '+ err.Message + EndOfLine + _ 'EndOfLine + _ 'CurrentEpisode.Parent.ShellPath.ReplaceAll("\","") + "/" + CurrentEpisode.NameNoExtension + ".nfo" 'Return 'Exception err as OutOfBoundsException 'MessageBox " 'Return End Sub #tag EndMethod #tag Note, Name = TVDB Api Docs http://thetvdb.com/wiki/index.php?title=Programmers_API #tag EndNote #tag Constant, Name = MirrorPath, Type = String, Dynamic = False, Default = \"https://www.thetvdb.com", Scope = Public #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Address" Visible=true Group="Behavior" Type="String" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="defaultPort" Group="Behavior" InitialValue="0" Type="integer" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="httpProxyAddress" Group="Behavior" Type="string" EditorType="MultiLineEditor" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="httpProxyPort" Group="Behavior" InitialValue="0" Type="integer" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag ViewProperty Name="Index" Visible=true Group="ID" Type="Integer" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Port" Visible=true Group="Behavior" InitialValue="0" Type="Integer" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InheritedFrom="TCPSocket" #tag EndViewProperty #tag ViewProperty Name="yield" Group="Behavior" InitialValue="0" Type="boolean" InheritedFrom="HTTPSocket" #tag EndViewProperty #tag EndViewBehavior End Class #tag EndClass \ No newline at end of file diff --git a/ViMM/FileTypes.rbbas b/ViMM/FileTypes.rbbas old mode 100755 new mode 100644 diff --git a/ViMM/Images/.DS_Store b/ViMM/Images/.DS_Store index b73d648..ed9953e 100755 Binary files a/ViMM/Images/.DS_Store and b/ViMM/Images/.DS_Store differ diff --git a/ViMM/Modules/Global Methods/Globals.rbbas b/ViMM/Modules/Global Methods/Globals.rbbas old mode 100755 new mode 100644 index 8510b0d..11eba4e --- a/ViMM/Modules/Global Methods/Globals.rbbas +++ b/ViMM/Modules/Global Methods/Globals.rbbas @@ -1 +1 @@ -#tag Module Protected Module Globals #tag Method, Flags = &h0 Sub Anonymouse(ByRef Sckt as HTTPSocket, Mac as Boolean = False) Dim rand as New Random Dim IP as String = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) Sckt.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) If NOT Mac Then Sckt.SetRequestHeader( "User-agent", "Mozilla/" + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,3) ) + " (Windows NT " + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,2) ) + "; rv:2.0.1) Gecko/20100101 Firefox/" + Str( rand.InRange(3,5) ) + ".0.1" ) Else Sckt.SetRequestHeader( "User-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Safari/8536.25" ) End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function BytesToString(Bytes As Variant, Format as String = "#.00") As String #pragma DisableBackgroundTasks #If NOT DebugBuild then #pragma DisableBoundsChecking #pragma NilObjectChecking False #pragma StackOverflowChecking False #EndIf Dim OneByte as Integer = 1024 #If TargetMacOS Then OneByte = 1000 Dim Result as String Select Case Bytes Case Is >= Pow( OneByte, 4 ) Result = Format( Bytes/Pow( onebyte, 4 ), Format ) + " TB" Case Is >= Pow( OneByte, 3 ) Result = Format( Bytes/Pow( onebyte, 3 ), Format ) + " GB" Case Is >= OneByte * OneByte Result = Format( Bytes/Pow( onebyte, 2 ), Format ) + " MB" Case Is >= OneByte Result = Format( Bytes/onebyte, Format ) + " KB" Else Result = Format( Bytes, "###" ) + " Bytes" End Select Return Result End Function #tag EndMethod #tag Method, Flags = &h0 Function Contains(Extends source As string, Find As string) As boolean if source.InStr( Find ) > 0 Then Return True Return False ' no more need for integer check on InStr() but just a boolean if found more then 0 items ' This function was made by: "relaht" (originally) ' From original post... //if header.Contains( ".gif") then //is the same as if Instr( header, ".gif" ) > 0 then ' this inspired me to write the same for DutchTools End Function #tag EndMethod #tag Method, Flags = &h0 Function CURL(URL as String) As String Dim sh as New Shell sh.Mode = 0 If sh = Nil Then Return "" sh.Execute "curl " + URL Return sh.Result End Function #tag EndMethod #tag Method, Flags = &h0 Sub DeleteWithAppleEvent(TheFile as FolderItem) If TheFile = Nil OR NOT TheFile.Exists Then Return Dim Path as String = DefineEncoding( TheFile.AbsolutePath, Encodings.UTF8 ) Path = Path.ReplaceAll("'", "'\''") 'Path = Path.ReplaceAll("é", "\é") #If TargetMacOS Then Dim ae as AppleEvent Dim obj as AppleEventObjectSpecifier ae = NewAppleEvent( "core", "delo", "MACS" ) obj = GetNamedObjectDescriptor( "cobj", nil, path ) ae.ObjectSpecifierParam("----") = obj If Not ae.send() Then MessageBox "Couldn't delete file using apple event" #EndIf TheFile = TheFile.Parent.Child( TheFile.Name ) 'If DebugBuild And TheFile <> Nil And TheFile.Exists Then MessageBox "Couldn't delete file" + EndOfLine + EndOfLine + Path // Back-up 'Dim f as FolderItem = GetFolderItem( Path.ReplaceAll("'\''", "'") ) If TheFile <> Nil And TheFile.Exists Then If TheFile.ParentVolume = App.ExecutableFile.ParentVolume Then TheFile.MoveFileTo SpecialFolder.Trash Else TheFile.Delete End If End If End Sub #tag EndMethod #tag Method, Flags = &h0 Sub echo(Message as String, f as FolderItem = Nil) If NOT DebugBuild Then Return If f = Nil Then f = SpecialFolder.Desktop.Child( "debug.txt" ) Dim s as New Shell Dim exe as String = "echo """ + Message + """ >> " + f.ShellPath s.Execute exe End Sub #tag EndMethod #tag Method, Flags = &h0 Function FileMD5(folderfile as FolderItem) As string Dim f as FolderItem Dim b as BinaryStream Dim s as String Dim d as new MD5Digest f = folderfile If f = Nil Then Return "Nil" If f.IsReadable = false And f.IsWriteable = False Then Return "Protected File" Else b=f.OpenAsBinaryFile(False) While NOT b.eof s=b.Read(1000000) d.Process s app.DoEvents Wend Return EncodeHex(d.Value) End if End Function #tag EndMethod #tag Method, Flags = &h0 Function FolderError(Extends TheItem as FolderItem) As Boolean Dim ItemName as String If TheItem <> Nil Then ItemName = TheItem.Name If TheItem.LastErrorCode > 0 Then Dim Error as String Select Case TheItem.LastErrorCode Case TheItem.DestDoesNotExistError Error = "Destination does not exist." // You will get this error only on CopyFileTo and MoveFileTo. Case TheItem.FileNotFound Error = "The File was not found." Case TheItem.AccessDenied Error = "Access was denied." Case TheItem.NotEnoughMemory Error = "You ran out of memory." Case TheItem.FileInUse Error = "The file is in use." Case TheItem.InvalidName Error = "You used an Invalid name." Else Error = Str( TheItem.LastErrorCode ) End Select Log( Trim( ItemName + " Error Code: " + Str( TheItem.LastErrorCode ) + EndOfLine + Error ) ) Return True Else Return False End If End Function #tag EndMethod #tag Method, Flags = &h0 Function Hash(f as FolderItem, Routine as String = "Video") As String // OpenSubtitles.org // Hash code is based on Media Player Classic. In natural language it calculates: size + 64bit chksum of the first and last 64k // (even if they overlap because the file is smaller than 128k). // On opensubtitles.org is movie file size limited to 9000000000 > $moviebytesize > 131072 bytes, if is there any reason to change these sizes, let us know. // Licence of hashing source codes is GPL. Source codes was tested on Little Endian - DEC, Intel and compatible // http://trac.opensubtitles.org/projects/opensubtitles/wiki/HashSourceCodes dim b as BinaryStream dim mb as MemoryBlock dim hash,bytesize as UINT64 dim i, x, chunksize, filelen, difference as integer dim myhash as String hash = 0 //Reset Hash difference = 0 if f <> nil and f.Exists And f.Length > 0 then b= f.OpenAsBinaryFile hash = b.Length bytesize = b.Length Dim bytesizestr as String = str(bytesize) if bytesize >= 65536 and routine = "video" then chunksize = 65536 mb = b.Read(65536) mb.LittleEndian = True for i= 0 to chunksize -1 step 8 hash = hash+ mb.UINT64Value(i) next b.Position = max(b.Length-chunksize, 0) mb= b.Read(chunksize) mb.LittleEndian = True for i= 0 to chunksize -1 step 8 hash = hash+ mb.UINT64Value(i) next myhash = Lowercase(str(hex(hash))) elseif routine = "subtitle" then dim c,result as string mb = md5(b.Read(b.Length)) mb.LittleEndian = True for i = 0 to mb.size-1 x = mb.byte( i ) c = right( "00"+hex( x ), 2 ) result = result + c next result = lowercase( result ) myhash = result end If End If Return MyHash End Function #tag EndMethod #tag Method, Flags = &h0 Function HTTPGet(URL as String, RandomIP as Boolean = False) As String dim sckt as New HTTPSocket sckt.Yield = True // Set header information IP/User-Agent if RandomIP then dim r as New Random sckt.SetRequestHeader( "REMOTE_ADDR", Str( r.InRange(0, 255) ) + "." + Str( r.InRange(0, 255) ) + "." + Str( r.InRange(0, 255) ) + "." + Str( r.InRange(0, 255) ) ) end if 'sckt.SetRequestHeader("Accept-Encoding", "gzip, deflate, sdch") sckt.SetRequestHeader("Accept-Language", "en-US,en;q=0.8,nl-NL;q=0.6,nl;q=0.4") sckt.SetRequestHeader("X-Requested-With", "XMLHttpRequest") sckt.SetRequestHeader("X-Prototype-Version", "1.7.1") sckt.SetRequestHeader("DNT", "1") sckt.SetRequestHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/601.5.17 (KHTML, like Gecko) Version/9.1 Safari/601.5.17") sckt.SetRequestHeader("Connection", "keep-alive") sckt.SetRequestHeader("Accept", "text/html,text/javascript,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") // Get content dim Content as String = sckt.Get( URL, 120 ) 'Trim( DefineEncoding( sckt.Get( URL, 60 ), Encodings.UTF8 ) ) // unzip GZIPped page if sckt.PageHeaders <> Nil and sckt.PageHeaders.Source <> "" and sckt.PageHeaders.Source.Contains( "Content-Encoding: gzip" ) then dim gzipstring as new _gzipstring Content = gzipstring.Decompress( Content ) end if Content = DefineEncoding( Content, Encodings.UTF8 ) Content = Trim( Content ) // Redirected if sckt <> Nil and sckt.HTTPStatusCode = 301 and sckt.PageHeaders <> Nil then URL = sckt.PageHeaders.Value( "Location" ) Content = trim( DefineEncoding( sckt.Get( URL, 60 ), Encodings.UTF8 ) ) end if sckt.Close sckt = Nil // Destroy socket Return Content End Function #tag EndMethod #tag Method, Flags = &h0 Function HTTPGetImage(URL as String) As Picture dim memblock as string = HTTPGet( URL ) if memblock <> "" then Return Picture.FromData( memblock ) else log "HTTPGetImage( " + URL + ") :: Couldn't fetch image." Return Nil end if End Function #tag EndMethod #tag Method, Flags = &h0 Function InRange(Extends Value as Double, Min as Double = 1, Max as Double = 32767) As Boolean If Value > Min And Value < Max Then Return True Return False End Function #tag EndMethod #tag Method, Flags = &h0 Function IsFile(Extends f as FolderItem) As Boolean Return ( f <> Nil And f.Exists And NOT f.Directory ) End Function #tag EndMethod #tag Method, Flags = &h0 Function IsFolder(Extends f as FolderItem) As Boolean Return ( f <> Nil And f.Exists And f.Directory ) End Function #tag EndMethod #tag Method, Flags = &h0 Function IsFolderItem(Extends f as FolderItem) As Boolean Return ( f <> Nil And f.Exists ) End Function #tag EndMethod #tag Method, Flags = &h0 Function IsLowerCase(Extends s As string) As boolean ' return a Boolean to the user. if asc(s) >= 65 and asc(s) <= 90 then ' we have no Lowercase string here, so return False return false elseif asc(s) >= 97 and asc(s) <= 122 then ' we have a Lowercase string, so return True return true end if ' this function is made by: "serd83" ' search for "IsLowerCase" on te forums to find original post ' updated to "Extends", with thanks to "Jason_Addams" for the suggestion. End Function #tag EndMethod #tag Method, Flags = &h0 Function IsLynx() As Boolean const kMacOSXMin = &h1090 #If TargetMacOS then Dim res As Integer Dim b As Boolean = System.Gestalt( "sysv", res ) If res >= kMacOSXMin Then Return True #EndIf End Function #tag EndMethod #tag Method, Flags = &h0 Function IsMountainLion() As Boolean const kMacOSXMin = &h1080 #If TargetMacOS then Dim res As Integer Dim b As Boolean = System.Gestalt( "sysv", res ) If res >= kMacOSXMin Then Return True #EndIf End Function #tag EndMethod #tag Method, Flags = &h0 Function LabelIndexGet(ForItem as FolderItem) As Integer Dim ae As AppleEvent Dim file As AppleEventObjectSpecifier Dim myPath as string If ForItem = Nil then return 0 ae = NewAppleEvent( "core", "getd", "MACS" ) // The "Get" apple event myPath = ForItem.AbsolutePath file = GetNamedObjectDescriptor( "alis", Nil, myPath ) //"Converts" a file to an AppleEvent object ae.ObjectSpecifierParam( "----" ) = GetPropertyObjectDescriptor( file, "labi" ) //This references the label index property of the "file" object. If NOT ae.Send then End If Return ae.ReplyInteger End Function #tag EndMethod #tag Method, Flags = &h0 Sub LabelIndexSet(ForItem as Folderitem, LabelIndex as Integer) // 0 = Clear // 1 = Orange // 2 = Red // 3 = Yellow // 4 = Blue // 5 = Purple // 6 = Green // 7 = Gray Dim ae As AppleEvent Dim f As FolderItem Dim file As AppleEventObjectSpecifier Dim myPath as string Dim o As AppleEventObjectSpecifier If ForItem = Nil then Return ae = NewAppleEvent( "core", "setd", "MACS" ) //The "Set" apple event myPath = ForItem.AbsolutePath file = GetNamedObjectDescriptor( "alis", Nil, myPath ) //"Converts" a file to an AppleEvent object ae.ObjectSpecifierParam( "----" ) = GetPropertyObjectDescriptor( file, "labi" ) //This references the label index property of the "file" object. ae.IntegerParam("data") = LabelIndex //The label index If Not ae.Send Then End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function LeadingZero(i as Integer, Len as Integer = 2) As String Dim Lead as String = Str( i ) While Lead.Len < Len Lead = "0" + Lead Wend Return Lead End Function #tag EndMethod #tag Method, Flags = &h0 Sub Log(Message as String, LogLevel as Integer = 1003) System.Log LogLevel, Message End Sub #tag EndMethod #tag Method, Flags = &h0 Function match(SrchPattern as String, Source as String, i as Integer = 0) As String Dim rg as New RegEx Dim myMatch as RegExMatch rg.Options.DotMatchAll = True rg.SearchPattern = SrchPattern myMatch = rg.search( Source ) #if DebugBuild then Dim Debug() as String If myMatch <> Nil Then For n as Integer = 0 to myMatch.SubExpressionCount -1 Debug.Append myMatch.SubExpressionString(n) Next End If #endif If myMatch <> Nil And myMatch.SubExpressionCount -1 >= i Then Return Trim( myMatch.SubExpressionString(i) ) End if Exception err as RegExException MsgBox err.message End Function #tag EndMethod #tag Method, Flags = &h0 Function match_all(SrchPattern as String, Source as String, i as Integer = 1) As String() Dim myRegEx As new RegEx Dim myMatch As RegExMatch myRegEx.Options.TreatTargetAsOneLine = True myRegEx.Options.DotMatchAll = True myRegEx.SearchPattern = SrchPattern myRegEx.ReplacementPattern = "" Dim Results() as String Dim Debug() as String // Pop up all matches one by one myMatch = myRegEx.Search( Source ) While myMatch <> Nil #if DebugBuild then For n as Integer = 0 to myMatch.SubExpressionCount - 1 Debug.Append trim( myMatch.SubExpressionString(n) ) Next #endif if myMatch.SubExpressionCount -1 >= i then Results.Append Trim( myMatch.SubExpressionString(i) ) End If Source = myRegEx.Replace( Source ) myMatch = myRegEx.Search() Wend Return Results End Function #tag EndMethod #tag Method, Flags = &h0 Function MsgDlg(w as Window, Type as Integer = 1, headerText as String, subText as String, okCaption as String, cancelCaption as String, otherCaption as String = "") As Integer Dim Msg as New MessageDialog // Declare the MessageDialog object Dim dlgBtn as MessageDialogButton // For handling the result Msg.Icon = Type // Display warning icon // OK Button Msg.ActionButton.Caption = okCaption // Show the "Cancel" button if available If cancelCaption <> "" Then Msg.CancelButton.Caption = cancelCaption Msg.CancelButton.Visible = True End If // Show the "Alternate" button if available If otherCaption <> "" Then Msg.AlternateActionButton.Caption = otherCaption Msg.AlternateActionButton.Visible = True End If Msg.Message = headerText Msg.Explanation = subText If w <> Nil Then dlgBtn = Msg.ShowModalWithin(w) Else dlgBtn = Msg.ShowModal Select Case dlgBtn Case Msg.ActionButton Return 1 Case Msg.AlternateActionButton Return 3 Case Msg.CancelButton Return 2 End Select End Function #tag EndMethod #tag Method, Flags = &h0 Function MyMid(Extends Source as String, StartStr as String, EndStr as String, Start as Integer = 0) As String Dim sx1, sx2 as Integer sx1 = Source.InStr( Start, StartStr ) + StartStr.Len sx2 = Source.InStr( sx1, EndStr ) Return Source.Mid( sx1, sx2 - sx1 ) End Function #tag EndMethod #tag Method, Flags = &h0 Function NameExtension(Extends TheFile as FolderItem) As String Dim FileName as String = TheFile.Name Dim FileSplit() as String = FileName.Split(".") Dim FileExtension as String = FileSplit( FileSplit.Ubound ) Return FileExtension End Function #tag EndMethod #tag Method, Flags = &h0 Function NameWithoutExtension(Extends TheFile as FolderItem) As String Dim FileName as String = TheFile.Name Dim FileSplit() as String = FileName.Split(".") Dim FileExtension as String = FileSplit( FileSplit.Ubound ) Return FileName.Left( FileName.Len - ( FileExtension.Len + 1 ) ) End Function #tag EndMethod #tag Method, Flags = &h0 Function Occurs(Extends cSearchWithin As String, cSearchFor As string) As integer '--- FINDS THE NUMBER OF OCCURENCES OF A STRING WITHIN ANOTHER STRING '--- USES THE NATIVE INSTR() FUNCTION '--- CASE INSENSITIVE '--- '--- Syntax: if Occurs(cSearchFor As String,cSearchWithin As String) > 0 then dim x as Integer = 0 dim nStart As Integer = 1 dim nFound as Integer = 0 while nStart < len(cSearchWithin) x = instr(nStart,cSearchWithin, cSearchFor) if x > 0 then nFound = nFound + 1 nStart = x + 1 Else Exit end wend Return nFound ' Gave it string extention functionallity: ' Use as function: Syntax: if Occurs(cSearchFor As String,cSearchWithin As String) > 0 then ' Or use as extention of string: ' Dim s as String ' if s.Occours(cSearchFor As string) > 0 then End Function #tag EndMethod #tag Method, Flags = &h0 Function ParentVolume(Extends TheFile as FolderItem) As FolderItem Dim Path as String = TheFile.ShellPath.ReplaceAll("\","") If Path.InStr( 0, "volume" ) > 0 Then Dim Pathways() as String = Path.Split("/") If Pathways.Ubound > 1 Then Return GetFolderItem( "/" + Pathways(1) + "/" + Pathways(2), FolderItem.PathTypeShell ) Else Return GetFolderItem( SpecialFolder.Mount.ShellPath + "/" + SpecialFolder.Mount.AbsolutePath.NthField(":",1), FolderItem.PathTypeShell ) End If End Function #tag EndMethod #tag Method, Flags = &h0 Function PictureToHTML(MyPic As Picture) As String Dim s As String = MyPic.GetData(Picture.FormatPNG) s = "" Return s End Function #tag EndMethod #tag Method, Flags = &h0 Function ReadTextFile(f as FolderItem) As String If f = Nil OR NOT f.Exists Then Return "" Dim TextIn as TextInputStream TextIn = TextIn.Open( f ) Dim Content as String = TextIn.ReadAll TextIn.Close Return Content End Function #tag EndMethod #tag Method, Flags = &h0 Function RegExResult(Source as String, SrchPattern as String) As String Dim rg as New RegEx Dim myMatch as RegExMatch rg.Options.DotMatchAll = True rg.SearchPattern = SrchPattern myMatch = rg.search( Source ) If myMatch <> Nil Then Return myMatch.SubExpressionString(0) Else Return "" End if Exception err as RegExException MsgBox err.message End Function #tag EndMethod #tag Method, Flags = &h0 Function RegExResults(Source as String, SrchPattern as String) As String() Dim rg as New RegEx Dim myMatch as RegExMatch rg.Options.DotMatchAll = True rg.SearchPattern = SrchPattern myMatch = rg.search( Source ) Dim Results() as String If myMatch <> Nil Then For i as Integer = 0 to myMatch.SubExpressionCount - 1 Results.Append myMatch.SubExpressionString(i) Next End if Return Results Exception err as RegExException MsgBox err.message End Function #tag EndMethod #tag Method, Flags = &h0 Function RegExThis(Source as String, SrchPattern as String, RplcPattern as String = "") As String // RegEx Dim myRegEx As new RegEx Dim myMatch As RegExMatch myRegEx.Options.TreatTargetAsOneLine = True myRegEx.Options.DotMatchAll = True myRegEx.SearchPattern = SrchPattern myRegEx.ReplacementPattern = RplcPattern // Pop up all matches one by one myMatch = myRegEx.Search( Source ) While myMatch <> Nil Source = myRegEx.Replace( Source ) myMatch = myRegEx.Search() Wend Return Source End Function #tag EndMethod #tag Method, Flags = &h0 Sub Reload(Extends cvs as Canvas, eraseBackground as Boolean = True) #If TargetCocoa Then cvs.Invalidate( eraseBackground ) Return #ElseIf TargetCarbon Then cvs.Refresh( eraseBackground ) Return #EndIf cvs.Invalidate( eraseBackground ) End Sub #tag EndMethod #tag Method, Flags = &h0 Function RemoveDuplicatesFromArray(aList() as String) As String() For i as Integer = 0 to aList.Ubound For n as Integer = i + 1 to aList.Ubound If aList(i) = aList(n) Then aList.Remove(n) Next n Next i For i as Integer = 0 to aList.Ubound For n as Integer = i + 1 to aList.Ubound If aList(i) = aList(n) Then aList.Remove(n) Next n Next i Return aList End Function #tag EndMethod #tag Method, Flags = &h0 Function RemoveLinks(Content as String) As String // RegEx Dim myRegEx As new RegEx Dim myMatch As RegExMatch myRegEx.Options.TreatTargetAsOneLine = True myRegEx.SearchPattern = "
" myRegEx.ReplacementPattern = "" // Pop up all matches one by one myMatch = myRegEx.Search( content ) While myMatch <> Nil content = myRegEx.Replace( content ) myMatch = myRegEx.Search() Wend content = content.ReplaceAll( "", "" ) Return Content End Function #tag EndMethod #tag Method, Flags = &h0 Sub SaveImage(img As Picture, TheFile as FolderItem, Type as FileType, Quality as Integer = 65) If img = Nil Then Return If Type = FileTypes.ImageJpeg Then If TheFile <> Nil Then TheFile.Name = TheFile.NameNoExtension + ".jpg" img.Save( TheFile, Picture.SaveAsJPEG, Quality )'Picture.QualityHigh ) ElseIf Type = FileTypes.ImagePng Then If TheFile <> Nil Then TheFile.Name = TheFile.NameNoExtension + ".png" img.Save( TheFile, Picture.SaveAsPNG, Quality )'Picture.QualityMax ) End If If TheFile.LastErrorCode <> 0 Then Return End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SaveText(SaveLocation as FolderItem, Text as String) If SaveLocation IsA object Then Dim TextOut as TextOutputStream = TextOutputStream.Create( SaveLocation ) TextOut.Write Text TextOut.Close End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function ScalingFactor(w as window) As Single 'Return 2 // The ScalingFactor is 2 for a retina MacBook Pro (or other HiDPI modes) and 1 for anything else. If NOT IsMountainLion Then Return 1 #If TargetCocoa Then Declare Function BackingScaleFactor Lib "AppKit" Selector "backingScaleFactor" (target As WindowPtr) as Double Return BackingScaleFactor(w) #Else Return 1 #EndIf End Function #tag EndMethod #tag Method, Flags = &h0 Function SelCol(Extends LstBox as Listbox, Collumn as Integer) As String If LstBox.ListIndex = -1 Then Return "" Return LstBox.Cell( LstBox.ListIndex, Collumn ) End Function #tag EndMethod #tag Method, Flags = &h0 Sub ShareFaceBookLink(URL as String, Title as String) Dim s as string = "http://www.facebook.com/sharer.php?u=@URL&t=@Title" s = s.ReplaceAll("@URL", URL) s = s.ReplaceAll("@Title", Title) ShowURL s End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShareTweet(Message as String, ScreenName as String = "") 'Dim s as String = "https://twitter.com/intent/tweet?original_referer=https%3A%2F%2Ftwitter.com%2Fabout%2Fresources%2Fbuttons&screen_name=@support&source=tweetbutton&text=$Message" Dim s as String = "https://twitter.com/intent/tweet?source=ViMediaManager&screen_name=@support&text=$Message" s = s.ReplaceAll( "@Support", ScreenName ) s = s.ReplaceAll( "$Message", Message.ReplaceAll( " ", "%20" ) ) ShowURL s End Sub #tag EndMethod #tag Method, Flags = &h0 Function ShellCommand(Command as String) As String dim sh as New Shell sh.Execute(Command) if sh.ErrorCode = 0 then return sh.ReadAll end if End Function #tag EndMethod #tag Method, Flags = &h21 Private Sub ShowInFinder(Extends f as Folderitem) If f = Nil or NOT f.Exists Then Return 'If f.AbsolutePath = SpecialFolder.Desktop.AbsolutePath Then Return Dim MyShell as New Shell Dim cmd as String #If TargetMacOS Then cmd = "osascript -e 'Tell application ""Finder"" to reveal """ + f.AbsolutePath.ReplaceAll("'", "'\''") + """' -e 'Tell application ""Finder"" to activate'" MyShell.Execute( cmd ) #ElseIf TargetWin32 Then cmd = "explorer.exe /select,"+ chr(34) + f.AbsolutePath + chr(34) MyShell.Execute( cmd ) #EndIf If DebugBuild And MyShell.Result <> "" Then MessageBox MyShell.Result End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SmoothResize(w as Window, Width as Integer, Height as Integer, align as Integer) // Added 11/13/2001 by Jarvis Badgley // Edited 12/05/2001 by Jarvis Badgley // Modified 2/3/2002 by Kevin Ballard // --- // Rewritten 2/22/2002 by Kevin Ballard // Based off of code by Jean-Francois Roy // --- // Modified 8/23/02 by Kevin Ballard // Modified 12/14/02 by Pedro fp // Modified 12/14/02 by Kevin Ballard // // Align numbers: // 0) Lock upper left // 1) Lock upper right // 2) Lock lower left // 3) Lock lower right // 4) Lock top center // 5) Lock left center // 6) Lock bottom center // 7) Lock right center #If targetmacos then Dim err, t, l as Integer Dim rect as MemoryBlock #If TargetCarbon then Declare Function TransitionWindow Lib CarbonLib (window as WindowPtr, effect as Integer, action as Integer, rect as Ptr) as Integer Declare Function GetWindowBounds Lib CarbonLib (window As WindowPtr, regionCode As Integer, globalBounds As Ptr) as Integer #ElseIf TargetCocoa then Declare Function TransitionWindow Lib CocoaLib (window as WindowPtr, effect as Integer, action as Integer, rect as Ptr) as Integer Declare Function GetWindowBounds Lib CocoaLib (window As WindowPtr, regionCode As Integer, globalBounds As Ptr) as Integer // Vidal: Cheating using MBS plugin. w.SmoothResizeMBS( Width, Height ) w.Width = Width w.Height = Height Return #ElseIf TargetWin32 Declare Function TransitionWindow Lib "WindowsLib" (window as WindowPtr, effect as Integer, action as Integer, rect as Ptr) as Integer Declare Function GetWindowBounds Lib "WindowsLib" (window As WindowPtr, regionCode As Integer, globalBounds As Ptr) as Integer #EndIf // we get the old window region rect = New MemoryBlock(8) err = GetWindowBounds(w, 32, rect) t = w.Top // Need to know where the top and left of the window go l = w.Left Select Case align // Use deltas in measurements, not absolutes Case 0 // Lock upper left rect.Short(4) = rect.Short(4) + (height - w.height) rect.Short(6) = rect.Short(6) + (width - w.width) Case 1 // Lock upper right rect.Short(2) = rect.Short(2) - (width - w.width) rect.Short(4) = rect.Short(4) + (height - w.height) l = l - (width - w.width) // Left side moves Case 2 // Lock lower left rect.Short(0) = rect.Short(0) - (height - w.height) rect.Short(6) = rect.Short(6) + (width - w.width) t = t - (height - w.height) // Top side moves Case 3 // Lock lower right rect.Short(0) = rect.Short(0) - (height - w.height) rect.Short(2) = rect.Short(2) - (width - w.width) t = t - (height - w.height) // Top side moves l = l - (width - w.width) // Left side moves Case 4 // Lock top center rect.Short(2) = rect.Short(2) - (width - w.width) / 2 rect.Short(4) = rect.Short(4) + (height - w.height) rect.Short(6) = rect.Short(6) + (width - w.width) / 2 l = l - (width - w.width)/2 // Both sides move Case 5 // Lock left center rect.Short(0) = rect.Short(0) - (height - w.height) / 2 rect.Short(4) = rect.Short(4) + (height - w.height) / 2 rect.Short(6) = rect.Short(6) + (width - w.width) t = t - (height - w.height) / 2 // Top moves Case 6 // Lock bottom center rect.Short(0) = rect.Short(0) - (height - w.height) rect.Short(2) = rect.Short(2) - (width - w.width) / 2 rect.Short(6) = rect.Short(6) + (width - w.width) / 2 t = t - (height - w.height) // Top moves l = l - (width - w.width) / 2 // Left moves Case 7 // Lock right center rect.Short(0) = rect.Short(0) - (height - w.height) / 2 rect.Short(2) = rect.Short(2) - (width - w.width) rect.Short(4) = rect.Short(4) + (height - w.height) / 2 t = t - (height - w.height) / 2// Top moves l = l - (width - w.width) // Left moves End Select // If none of these, don't change // transition err = TransitionWindow(w, 3, 4, rect) // have to manually set the window's new height after resizing the window w.Top = t w.Left = l w.Width = width w.Height = height w.Refresh #endif #if TargetWin32 then w.width=width w.height=height #endif End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SocketError(Code as Integer, sckt as HTTPSocket) //HTTPSocket error codes and user notification Dim ErrorString As String ErrorString = "HTTP Error: " + str(code) + " occured." + chr(13) + chr(13) Select case code case 100 ErrorString = ErrorString + "Driver error" case 102 ErrorString = ErrorString + "Connection Lost" + Loc.kDownloadFailed case 103 ErrorString = ErrorString + "Unresolved Host, " + Loc.kCheckInternetConnection.Lowercase case 105 ErrorString = ErrorString + "Port Bind Error" case 106 ErrorString = ErrorString + "Invalid Socket State" case 107 ErrorString = ErrorString + "Invalid Port" case 108 ErrorString = ErrorString + "Out Of Memory" case 400 ErrorString = ErrorString + "Bad Request" case 401 ErrorString = ErrorString + "Unauthorized" case 414 ErrorString = ErrorString + "Request-URI Too Long" case 500 ErrorString = ErrorString + "Internal Server Error" case 505 ErrorString = ErrorString + "HTTP Version Not Supported" case 509 ErrorString = ErrorString + "Bandwidth Limit Exceeded" else ErrorString = ErrorString + "Unknown or Undefined. Error Code" end Select 'wndProgress.Close 'If CommonCore.MassSearch Then If NOT nc.Available then if NOT Growl.Notify( App.kAppName, ErrorString ) then if NOT CommonCore.MassSearch Then MessageBox ErrorString end if Else nc.Message ErrorString End If 'Else 'MessageBox ErrorString 'End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function String2Entities(s as String) As String 's = s.ReplaceAll(" ", "+" ) 's = s.ReplaceAll("&", "%26") 's = s.ReplaceAll("Ärk", "%C4") 's = s.ReplaceAll("Ërk", "%CB") 's = s.ReplaceAll("Ïrk", "%CF") 's = s.ReplaceAll("Ð", "E") 's = s.ReplaceAll("Örk", "%D6") 's = s.ReplaceAll("×", "") 's = s.ReplaceAll("Ürk", "%DC") 's = s.ReplaceAll("Þ", "") 's = s.ReplaceAll("Þ", "%DE") 's = s.ReplaceAll("ß", "") 's = s.ReplaceAll("ð", "%F0") 's = s.ReplaceAll("÷", "") 's = s.ReplaceAll("÷", "%F7") 's = s.ReplaceAll("þ", "") 's = s.ReplaceAll("þ", "%FE") // ---- 's = s.ReplaceAll("Ḁ", "A") 's = s.ReplaceAll("ḉ", "c") 's = s.ReplaceAll("Ḟ", "F") 's = s.ReplaceAll("Ḡ", "G") 's = s.ReplaceAll("Ḣ", "H") 's = s.ReplaceAll("Ḥ", "H") 's = s.ReplaceAll("Ḧ", "H") 's = s.ReplaceAll("Ṙ", "R") 's = s.ReplaceAll("Ṡ", "S") 's = s.ReplaceAll("Ṣ", "S") 's = s.ReplaceAll("Ṥ", "S") 's = s.ReplaceAll("Ṧ", "S") 's = s.ReplaceAll("Ṵ", "U") 's = s.ReplaceAll("Ṽ", "V") 's = s.ReplaceAll("Ẁ", "W") 's = s.ReplaceAll("Ẃ", "W") 's = s.ReplaceAll("Ẅ", "W") 's = s.ReplaceAll("Ẇ", "W") 's = s.ReplaceAll("Ẑ", "Z") 's = s.ReplaceAll("Ả", "A") 's = s.ReplaceAll("Ẻ", "E") 's = s.ReplaceAll("Ẽ", "E") 's = s.ReplaceAll("Ề", "E") 's = s.ReplaceAll("Ỉ", "I") 's = s.ReplaceAll("À", "A") 's = s.ReplaceAll("Á", "A") 's = s.ReplaceAll("Â", "A") 's = s.ReplaceAll("Ã", "A") 's = s.ReplaceAll("Ä", "A") 's = s.ReplaceAll("Å", "A") 's = s.ReplaceAll("Æ", "AE") 's = s.ReplaceAll("Ç", "C") 's = s.ReplaceAll("È", "E") 's = s.ReplaceAll("É", "E") 's = s.ReplaceAll("Ê", "E") 's = s.ReplaceAll("Ë", "E") 's = s.ReplaceAll("Ì", "I") 's = s.ReplaceAll("Í", "I") 's = s.ReplaceAll("Î", "I") 's = s.ReplaceAll("Ï", "I") 's = s.ReplaceAll("Ñ", "N") 's = s.ReplaceAll("Ò", "O") 's = s.ReplaceAll("Ó", "O") 's = s.ReplaceAll("Ô", "O") 's = s.ReplaceAll("Õ", "O") 's = s.ReplaceAll("Ö", "O") 's = s.ReplaceAll("Ø", "O") 's = s.ReplaceAll("Ù", "U") 's = s.ReplaceAll("Ú", "U") 's = s.ReplaceAll("Û", "U") 's = s.ReplaceAll("õ", "o") 's = s.ReplaceAll("Ü", "U") 's = s.ReplaceAll("Ý", "Y") 's = s.ReplaceAll("ßre", "s") 's = s.ReplaceAll("à", "a") 's = s.ReplaceAll("á", "a") 's = s.ReplaceAll("â", "a") 's = s.ReplaceAll("ã", "a") 's = s.ReplaceAll("ä", "a") 's = s.ReplaceAll("å", "a") 's = s.ReplaceAll("æ", "ae") 's = s.ReplaceAll("ç", "c") 's = s.ReplaceAll("è", "e") 's = s.ReplaceAll("é", "e") 's = s.ReplaceAll("ê", "e") 's = s.ReplaceAll("ë", "e") 's = s.ReplaceAll("ì", "i") 's = s.ReplaceAll("í", "i") 's = s.ReplaceAll("î", "i") 's = s.ReplaceAll("ï", "i") 's = s.ReplaceAll("ð", "d") 's = s.ReplaceAll("ñ", "n") 's = s.ReplaceAll("ò", "o") 's = s.ReplaceAll("ó", "o") 's = s.ReplaceAll("ô", "o") 's = s.ReplaceAll("ö", "o") 's = s.ReplaceAll("ø", "o") 's = s.ReplaceAll("ù", "u") 's = s.ReplaceAll("ú", "u") 's = s.ReplaceAll("û", "u") 's = s.ReplaceAll("ü", "u") 's = s.ReplaceAll("ý", "y") 's = s.ReplaceAll("ÿ", "y") 's = s.ReplaceAll("Ā", "A") 's = s.ReplaceAll("Ă", "A") 's = s.ReplaceAll("Ą", "A") 's = s.ReplaceAll("Ć", "C") 's = s.ReplaceAll("ć", "c") 's = s.ReplaceAll("ĉ", "c") 's = s.ReplaceAll("Č", "C") 's = s.ReplaceAll("Ē", "E") 's = s.ReplaceAll("Ĕ", "E") 's = s.ReplaceAll("Ė", "E") 's = s.ReplaceAll("Ě", "E") 's = s.ReplaceAll("Ĝ", "G") 's = s.ReplaceAll("Ğ", "G") 's = s.ReplaceAll("Ġ", "G") 's = s.ReplaceAll("Ĥ", "H") 's = s.ReplaceAll("Ĩ", "I") 's = s.ReplaceAll("Ŏ", "O") 's = s.ReplaceAll("Ő", "O") 's = s.ReplaceAll("Ŕ", "R") 's = s.ReplaceAll("Ř", "R") 's = s.ReplaceAll("Ś", "S") 's = s.ReplaceAll("Ŝ", "S") 's = s.ReplaceAll("Ş", "S") 's = s.ReplaceAll("Š", "S") 's = s.ReplaceAll("Ũ", "U") 's = s.ReplaceAll("Ů", "U") 's = s.ReplaceAll("ů", "u") 's = s.ReplaceAll("Ű", "U") 's = s.ReplaceAll("Ų", "U") 's = s.ReplaceAll("Ź", "Z") 's = s.ReplaceAll("Ż", "Z") 's = s.ReplaceAll("Ž", "Z") 's = s.ReplaceAll("Ɛ", "E") 's = s.ReplaceAll("Ǎ", "A") 's = s.ReplaceAll("Ǒ", "O") 's = s.ReplaceAll("Ǔ", "U") 's = s.ReplaceAll("Ǧ", "G") 's = s.ReplaceAll("Ǵ", "G") 's = s.ReplaceAll("ǽ", "ae") 's = s.ReplaceAll("Ȁ", "A") 's = s.ReplaceAll("Ȃ", "A") 's = s.ReplaceAll("Ȅ", "E") 's = s.ReplaceAll("Ȇ", "E") 's = s.ReplaceAll("Ȍ", "O") 's = s.ReplaceAll("Ȑ", "R") 's = s.ReplaceAll("Ȓ", "R") 's = s.ReplaceAll("Ȕ", "U") 's = s.ReplaceAll("Ș", "S") 's = s.ReplaceAll("Ȟ", "H") 's = s.ReplaceAll("Ȧ", "A") 's = s.ReplaceAll("Ȩ", "E") // ---- 's = s.ReplaceAll("%", "%25") 's = s.ReplaceAll("?", "%3F") 's = s.ReplaceAll("=", "%3D") 's = s.ReplaceAll("@", "%40") ''s = s.ReplaceAll("/", "%2F") 's = s.ReplaceAll("À", "%C0") 's = s.ReplaceAll("Á", "%C1") 's = s.ReplaceAll("Â", "%C2") 's = s.ReplaceAll("Ã", "%C3") 's = s.ReplaceAll("Ärk", "%C4") 's = s.ReplaceAll("Å", "%C5") 's = s.ReplaceAll("Æ", "%C6") 's = s.ReplaceAll("Ç", "%C7") 's = s.ReplaceAll("È", "%C8") 's = s.ReplaceAll("É", "%C9") 's = s.ReplaceAll("Ê", "%CA") 's = s.ReplaceAll("Ërk", "%CB") 's = s.ReplaceAll("Ì", "%CC") 's = s.ReplaceAll("Í", "%CD") 's = s.ReplaceAll("Î", "%CE") 's = s.ReplaceAll("Ïrk", "%CF") 's = s.ReplaceAll("Ð", "%D0") 's = s.ReplaceAll("Ñ", "%D1") 's = s.ReplaceAll("Ò", "%D2") 's = s.ReplaceAll("Ó", "%D3") 's = s.ReplaceAll("Ô", "%D4") 's = s.ReplaceAll("Õ", "%D5") 's = s.ReplaceAll("Örk", "%D6") 's = s.ReplaceAll("×", "%D7") 's = s.ReplaceAll("Ø", "%D8") 's = s.ReplaceAll("Ù", "%D9") 's = s.ReplaceAll("Ú", "%DA") 's = s.ReplaceAll("Û", "%DB") 's = s.ReplaceAll("Ürk", "%DC") 's = s.ReplaceAll("Ý", "%DD") 's = s.ReplaceAll("Þ", "%DE") 's = s.ReplaceAll("ßre", "%DF") 's = s.ReplaceAll("à", "%E0") 's = s.ReplaceAll("á", "%E1") 's = s.ReplaceAll("â", "%E2") 's = s.ReplaceAll("ã", "%E3") 's = s.ReplaceAll("ä", "%E4") 's = s.ReplaceAll("å", "%E5") 's = s.ReplaceAll("æ", "%E6") 's = s.ReplaceAll("ç", "%E7") 's = s.ReplaceAll("è", "%E8") 's = s.ReplaceAll("é", "%E9") 's = s.ReplaceAll("ê", "%EA") 's = s.ReplaceAll("ë", "%EB") 's = s.ReplaceAll("ì", "%EC") 's = s.ReplaceAll("í", "%ED") 's = s.ReplaceAll("î", "%EE") 's = s.ReplaceAll("ï", "%EF") 's = s.ReplaceAll("ð", "%F0") 's = s.ReplaceAll("ñ", "%F1") 's = s.ReplaceAll("ò", "%F2") 's = s.ReplaceAll("ó", "%F3") 's = s.ReplaceAll("ô", "%F4") 's = s.ReplaceAll("õ", "%F5") 's = s.ReplaceAll("ö", "%F6") 's = s.ReplaceAll("÷", "%F7") 's = s.ReplaceAll("ø", "%F8") 's = s.ReplaceAll("ù", "%F9") 's = s.ReplaceAll("ú", "%FA") 's = s.ReplaceAll("û", "%FB") 's = s.ReplaceAll("ü", "%FC") 's = s.ReplaceAll("ý", "%FD") 's = s.ReplaceAll("þ", "%FE") 's = s.ReplaceAll("ÿ", "%FF") s = ConvertEncoding( s, Encodings.ASCII ) // Unicode characters such as 'é' will be renamed to e%CC%81, etc. 's = EncodingToURLMBS( s ) s = URLEncode( s ) 'return s // Saving characters that shouldn't be filtered out. s = s.ReplaceAll("%3A", ":") s = s.ReplaceAll("%28", "(") s = s.ReplaceAll("%29", ")") 's = s.ReplaceAll("%27", "'") s = s.ReplaceAll("%26", "&") s = s.ReplaceAll("%25", "") s = s.ReplaceAll("%20", " ") s = s.ReplaceAll("%2D", "-") s = s.ReplaceAll("%2F", "/") // Filter out the 'unicode' characters %CC, etc. Dim Character() as String = s.Split("") Dim Unicode() as String For i as Integer = s.Len - 1 DownTo 0 If Character(i) = "%" Then Unicode.append s.Mid( i + 1, 3 ) Next For i as Integer = 0 to Unicode.Ubound s = s.ReplaceAll( Unicode(i), "" ) Next // Re-placing characters back into the name. s = s.ReplaceAll( "", "%") s = s.ReplaceAll( " ", "%20" ) s = s.ReplaceAll( "&", "%26" ) s = s.ReplaceAll( "/", "%2F" ) Return s End Function #tag EndMethod #tag Method, Flags = &h0 Function StringToHex(src as string, separator as string) As string Dim n, L, v as integer Dim s as string L = LenB(src) For n=1 to L v = AscB(MidB(src, n, 1)) s = s + RightB("00"+Hex(v),2)+separator Next Return LeftB(s, LenB(s)-LenB(separator)) End Function #tag EndMethod #tag Method, Flags = &h0 Function SymLink(TheFile as FolderItem, Destination as FolderItem) As Boolean If TheFile = Nil OR NOT TheFile.Exists Then Return False If Destination = Nil OR Destination.Exists Then Return False Dim ExeStr as String = "ln -s " + TheFile.ShellPath + " " + Destination.ShellPath Dim sh as New Shell sh.Execute ExeStr Return sh.ReadAll = "" End Function #tag EndMethod #tag Method, Flags = &h0 Sub URL2Picture(URL as String, f as FolderItem = Nil, FileName as String = "") Dim sckt as new HTTPSocket Dim TheFile as FolderItem Dim FileSaved as Boolean sckt.Yield = True // URL = String2Entities( URL ) If FileName = "" Then Dim Name() as String = URL.Split("/") FileName = Name( Name.Ubound ) End If If f <> Nil then TheFile = f.Child( FileName ) Else TheFile = SpecialFolder.Temporary.Child( App.Identifier ).Child( FileName ) End If If TheFile <> Nil and URL <> "" then // Save file if one doesn't exist already. If f <> Nil and TheFile.Exists then FileSaved = True // Don't want to overwrite existing images. ElseIf System.Network.IsConnected then If TheFile.Exists then TheFile.Delete FileSaved = sckt.Get( URL, TheFile, Prefs.integerForKey("TimeOut") ) sckt.Close End If If NOT FileSaved then Dim FileSystemErrorCode as Integer = sckt.LastErrorCode // sckt.Close // For extra measure If TheFile.Exists then TheFile.Delete // Don't leave partially downloaded files. // Notify If nc.Available Then nc.Notify( f.Parent.Name, "", Loc.kConnectionTimedOut ) Else If NOT Growl.Notify( f.Parent.Name + " Error: " + str( FileSystemErrorCode ), Loc.kConnectionTimedOut ) Then MessageBox f.Parent.Name + " Error: " + str( FileSystemErrorCode ) + chr(13) + chr(13) + Loc.kConnectionTimedOut End If End If Return Else // sckt.Close // For extra measure 'Return Picture.Open( TheFile ) End If End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function URL2Picture(URL as String, f as FolderItem = Nil, FileName as String = "") As Picture Dim sckt as new HTTPSocket Dim TheFile as FolderItem Dim FileSaved as Boolean sckt.Yield = True // URL = String2Entities( URL ) If FileName = "" Then Dim Name() as String = URL.Split("/") FileName = Name( Name.Ubound ) End If If f <> Nil then TheFile = f.Child( FileName ) Else TheFile = SpecialFolder.Temporary.Child( App.Identifier ).Child( FileName ) End If If TheFile <> Nil and URL <> "" then // Save file if one doesn't exist already. If f <> Nil and TheFile.Exists then FileSaved = True // Don't want to overwrite existing images. ElseIf System.Network.IsConnected then If TheFile.Exists then TheFile.Delete FileSaved = sckt.Get( URL, TheFile, Prefs.integerForKey("TimeOut") ) sckt.Close End If If NOT FileSaved then Dim FileSystemErrorCode as Integer = sckt.LastErrorCode // sckt.Close // For extra measure If TheFile.Exists Then TheFile.Delete // Don't leave partially downloaded files. // Notify If nc.Available Then nc.Notify( f.Parent.Name, "", Loc.kConnectionTimedOut ) Else If NOT Growl.Notify( f.Parent.Name + " Error: " + str( FileSystemErrorCode ), Loc.kConnectionTimedOut ) Then MessageBox f.Parent.Name + " Error: " + str( FileSystemErrorCode ) + chr(13) + chr(13) + Loc.kConnectionTimedOut End If End If Return Nil Else // sckt.Close // For extra measure Return Picture.Open( TheFile ) End If End If End Function #tag EndMethod #tag Method, Flags = &h0 Function URLDecode(s as String) As String Dim TempAns As String Dim CurChr As Integer CurChr = 1 Do Until CurChr - 1 = Len(s) Select Case Mid(s, CurChr, 1) Case "+" TempAns = TempAns + " " Case "%" TempAns = TempAns + Chr(Val("&h" + Mid(s, CurChr + 1, 2))) CurChr = CurChr + 2 Case Else TempAns = TempAns + Mid(s, CurChr, 1) End Select CurChr = CurChr + 1 Loop Return TempAns End Function #tag EndMethod #tag Method, Flags = &h0 Function URLEncode(s as String) As String Dim TempAns As String Dim CurChr As Integer CurChr = 1 Do Until CurChr - 1 = Len(s) Select Case Asc(Mid(s, CurChr, 1)) Case 48 To 57, 65 To 90, 97 To 122 TempAns = TempAns + Mid(s, CurChr, 1) Case 32 TempAns = TempAns + "%" + Hex(32) Case Else TempAns = TempAns +"%" + Right("0" + Hex(Asc(Mid(s, CurChr, 1))), 2) End Select CurChr = CurChr + 1 Loop Return TempAns End Function #tag EndMethod #tag Method, Flags = &h0 Sub WriteTextFile(Content as String, f as FolderItem) If f = Nil OR f.Parent = Nil OR NOT f.Parent.Exists Then Return Dim TextOut as TextOutputStream If f.Parent.IsWriteable Then Try TextOut = TextOut.Create( f ) TextOut.Write( Content ) TextOut.Close Catch err as IOException MessageBox "I do not have permission to write to """ + f.Parent.Name + """." Return End Try Else MessageBox "I Don't have permission to write to """ + f.Parent.Name + """." End If exception err as IOException App.ErrorMessage = "An IO exception occurred ERROR No: " + Str( err.ErrorNumber ) + chr(13) + chr(13) + _ "Couldn't write " + f.name + " to location " + f.Parent.Name + "." + chr(13) + _ "Do we have permission to write to this location?" Dim w as New wndBugReporter w.Init( err, "WriteTextFile - " + chr(13) + App.ErrorMessage ) App.ErrorMessage = "" TextOut.Close Return Exception Err as NilObjectException If f.Parent = Nil Then App.ErrorMessage = "I can't write to the specified location" Dim w as New wndBugReporter w.Init( err, "WriteTextFile - " + f.ShellPath.ReplaceAll("\","") + Chr(13) + app.ErrorMessage ) App.ErrorMessage = "" Return End Sub #tag EndMethod #tag Constant, Name = CarbonLib, Type = String, Dynamic = False, Default = \"Carbon.framework", Scope = Public #tag EndConstant #tag Constant, Name = CocoaLib, Type = String, Dynamic = False, Default = \"Cocoa.framework", Scope = Public #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Index" Visible=true Group="ID" InitialValue="-2147483648" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag EndViewBehavior End Module #tag EndModule \ No newline at end of file +#tag Module Protected Module Globals #tag Method, Flags = &h0 Sub Anonymouse(ByRef Sckt as HTTPSocket, Mac as Boolean = False) Dim rand as New Random Dim IP as String = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) Sckt.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) If NOT Mac Then Sckt.SetRequestHeader( "User-agent", "Mozilla/" + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,3) ) + " (Windows NT " + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,2) ) + "; rv:2.0.1) Gecko/20100101 Firefox/" + Str( rand.InRange(3,5) ) + ".0.1" ) Else Sckt.SetRequestHeader( "User-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Safari/8536.25" ) End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function BytesToString(Bytes As Variant, Format as String = "#.00") As String #pragma DisableBackgroundTasks #If NOT DebugBuild then #pragma DisableBoundsChecking #pragma NilObjectChecking False #pragma StackOverflowChecking False #EndIf Dim OneByte as Integer = 1024 #If TargetMacOS Then OneByte = 1000 Dim Result as String Select Case Bytes Case Is >= Pow( OneByte, 4 ) Result = Format( Bytes/Pow( onebyte, 4 ), Format ) + " TB" Case Is >= Pow( OneByte, 3 ) Result = Format( Bytes/Pow( onebyte, 3 ), Format ) + " GB" Case Is >= OneByte * OneByte Result = Format( Bytes/Pow( onebyte, 2 ), Format ) + " MB" Case Is >= OneByte Result = Format( Bytes/onebyte, Format ) + " KB" Else Result = Format( Bytes, "###" ) + " Bytes" End Select Return Result End Function #tag EndMethod #tag Method, Flags = &h0 Function Contains(Extends source As string, Find As string) As boolean if source.InStr( Find ) > 0 Then Return True Return False ' no more need for integer check on InStr() but just a boolean if found more then 0 items ' This function was made by: "relaht" (originally) ' From original post... //if header.Contains( ".gif") then //is the same as if Instr( header, ".gif" ) > 0 then ' this inspired me to write the same for DutchTools End Function #tag EndMethod #tag Method, Flags = &h0 Function CURLGet(URL as String) As String dim sh as new Shell sh.Execute "curl -s " + URL Return sh.Result End Function #tag EndMethod #tag Method, Flags = &h0 Function DecodeHTML(Extends HTMLString as String) As String Return DecodeHTML( HTMLString ) End Function #tag EndMethod #tag Method, Flags = &h0 Function DecodeHTML(HTMLString as String) As String // Simplify quotes HTMLString = HTMLString.ReplaceAll( "“", """" ) HTMLString = HTMLString.ReplaceAll( "”", """" ) HTMLString = HTMLString.ReplaceAll( "‘", "'" ) HTMLString = HTMLString.ReplaceAll( "’", "'" ) HTMLString = HTMLString.ReplaceAll( "'", "'" ) HTMLString = HTMLString.ReplaceAll( """, """" ) HTMLString = HTMLString.ReplaceAll( "’", "'" ) 'HTMLString = HTMLString.ReplaceAll( "‚Äî", "—" ) 'HTMLString = HTMLString.ReplaceAll("—", "—") HTMLString = HTMLString.ReplaceAll( "
", EndOfLine ) HTMLString = HTMLString.ReplaceAll( "
", EndOfLine ) HTMLString = HTMLString.ReplaceAll( "
Nil And TheFile.Exists Then MessageBox "Couldn't delete file" + EndOfLine + EndOfLine + Path // Back-up 'Dim f as FolderItem = GetFolderItem( Path.ReplaceAll("'\''", "'") ) If TheFile <> Nil And TheFile.Exists Then If TheFile.ParentVolume = App.ExecutableFile.ParentVolume Then TheFile.MoveFileTo SpecialFolder.Trash Else TheFile.Delete End If End If End Sub #tag EndMethod #tag Method, Flags = &h0 Sub echo(Message as String, f as FolderItem = Nil) If NOT DebugBuild Then Return If f = Nil Then f = SpecialFolder.Desktop.Child( "debug.txt" ) Dim s as New Shell Dim exe as String = "echo """ + Message + """ >> " + f.ShellPath s.Execute exe End Sub #tag EndMethod #tag Method, Flags = &h0 Function FileMD5(folderfile as FolderItem) As string Dim f as FolderItem Dim b as BinaryStream Dim s as String Dim d as new MD5Digest f = folderfile If f = Nil Then Return "Nil" If f.IsReadable = false And f.IsWriteable = False Then Return "Protected File" Else b=f.OpenAsBinaryFile(False) While NOT b.eof s=b.Read(1000000) d.Process s app.DoEvents Wend Return EncodeHex(d.Value) End if End Function #tag EndMethod #tag Method, Flags = &h0 Function FolderError(Extends TheItem as FolderItem) As Boolean Dim ItemName as String If TheItem <> Nil Then ItemName = TheItem.Name If TheItem.LastErrorCode > 0 Then Dim Error as String Select Case TheItem.LastErrorCode Case TheItem.DestDoesNotExistError Error = "Destination does not exist." // You will get this error only on CopyFileTo and MoveFileTo. Case TheItem.FileNotFound Error = "The File was not found." Case TheItem.AccessDenied Error = "Access was denied." Case TheItem.NotEnoughMemory Error = "You ran out of memory." Case TheItem.FileInUse Error = "The file is in use." Case TheItem.InvalidName Error = "You used an Invalid name." Else Error = Str( TheItem.LastErrorCode ) End Select Log( Trim( ItemName + " Error Code: " + Str( TheItem.LastErrorCode ) + EndOfLine + Error ) ) Return True Else Return False End If End Function #tag EndMethod #tag Method, Flags = &h0 Function Hash(f as FolderItem, Routine as String = "Video") As String // OpenSubtitles.org // Hash code is based on Media Player Classic. In natural language it calculates: size + 64bit chksum of the first and last 64k // (even if they overlap because the file is smaller than 128k). // On opensubtitles.org is movie file size limited to 9000000000 > $moviebytesize > 131072 bytes, if is there any reason to change these sizes, let us know. // Licence of hashing source codes is GPL. Source codes was tested on Little Endian - DEC, Intel and compatible // http://trac.opensubtitles.org/projects/opensubtitles/wiki/HashSourceCodes dim b as BinaryStream dim mb as MemoryBlock dim hash,bytesize as UINT64 dim i, x, chunksize, filelen, difference as integer dim myhash as String hash = 0 //Reset Hash difference = 0 if f <> nil and f.Exists And f.Length > 0 then b= f.OpenAsBinaryFile hash = b.Length bytesize = b.Length Dim bytesizestr as String = str(bytesize) if bytesize >= 65536 and routine = "video" then chunksize = 65536 mb = b.Read(65536) mb.LittleEndian = True for i= 0 to chunksize -1 step 8 hash = hash+ mb.UINT64Value(i) next b.Position = max(b.Length-chunksize, 0) mb= b.Read(chunksize) mb.LittleEndian = True for i= 0 to chunksize -1 step 8 hash = hash+ mb.UINT64Value(i) next myhash = Lowercase(str(hex(hash))) elseif routine = "subtitle" then dim c,result as string mb = md5(b.Read(b.Length)) mb.LittleEndian = True for i = 0 to mb.size-1 x = mb.byte( i ) c = right( "00"+hex( x ), 2 ) result = result + c next result = lowercase( result ) myhash = result end If End If Return MyHash End Function #tag EndMethod #tag Method, Flags = &h0 Function HTTPGet(URL as String, RandomIP as Boolean = False) As String dim sckt as New HTTPSocket sckt.Yield = True // Set header information IP/User-Agent if RandomIP then dim r as New Random sckt.SetRequestHeader( "REMOTE_ADDR", Str( r.InRange(0, 255) ) + "." + Str( r.InRange(0, 255) ) + "." + Str( r.InRange(0, 255) ) + "." + Str( r.InRange(0, 255) ) ) end if 'sckt.SetRequestHeader("Accept-Encoding", "gzip, deflate, sdch") sckt.SetRequestHeader("Accept-Language", "en-US,en;q=0.8,nl-NL;q=0.6,nl;q=0.4") sckt.SetRequestHeader("X-Requested-With", "XMLHttpRequest") sckt.SetRequestHeader("X-Prototype-Version", "1.7.1") sckt.SetRequestHeader("DNT", "1") sckt.SetRequestHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/601.5.17 (KHTML, like Gecko) Version/9.1 Safari/601.5.17") sckt.SetRequestHeader("Connection", "keep-alive") sckt.SetRequestHeader("Accept", "text/html,text/javascript,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") // Get content dim Content as String = sckt.Get( URL, 120 ) 'Trim( DefineEncoding( sckt.Get( URL, 60 ), Encodings.UTF8 ) ) // unzip GZIPped page if sckt.PageHeaders <> Nil and sckt.PageHeaders.Source <> "" and sckt.PageHeaders.Source.Contains( "Content-Encoding: gzip" ) then dim gzipstring as new _gzipstring Content = gzipstring.Decompress( Content ) end if Content = DefineEncoding( Content, Encodings.UTF8 ) Content = Trim( Content ) // Redirected if sckt <> Nil and sckt.HTTPStatusCode = 301 and sckt.PageHeaders <> Nil then URL = sckt.PageHeaders.Value( "Location" ) Content = trim( DefineEncoding( sckt.Get( URL, 60 ), Encodings.UTF8 ) ) end if sckt.Close sckt = Nil // Destroy socket Return Content End Function #tag EndMethod #tag Method, Flags = &h0 Function HTTPGetImage(URL as String) As Picture dim memblock as string = HTTPGet( URL ) if memblock <> "" then Return Picture.FromData( memblock ) else log "HTTPGetImage( " + URL + ") :: Couldn't fetch image." Return Nil end if End Function #tag EndMethod #tag Method, Flags = &h0 Function InRange(Extends Value as Double, Min as Double = 1, Max as Double = 32767) As Boolean If Value > Min And Value < Max Then Return True Return False End Function #tag EndMethod #tag Method, Flags = &h0 Function IsFile(Extends f as FolderItem) As Boolean Return ( f <> Nil And f.Exists And NOT f.Directory ) End Function #tag EndMethod #tag Method, Flags = &h0 Function IsFolder(Extends f as FolderItem) As Boolean Return ( f <> Nil And f.Exists And f.Directory ) End Function #tag EndMethod #tag Method, Flags = &h0 Function IsFolderItem(Extends f as FolderItem) As Boolean Return ( f <> Nil And f.Exists ) End Function #tag EndMethod #tag Method, Flags = &h0 Function IsLowerCase(Extends s As string) As boolean ' return a Boolean to the user. if asc(s) >= 65 and asc(s) <= 90 then ' we have no Lowercase string here, so return False return false elseif asc(s) >= 97 and asc(s) <= 122 then ' we have a Lowercase string, so return True return true end if ' this function is made by: "serd83" ' search for "IsLowerCase" on te forums to find original post ' updated to "Extends", with thanks to "Jason_Addams" for the suggestion. End Function #tag EndMethod #tag Method, Flags = &h0 Function IsLynx() As Boolean const kMacOSXMin = &h1090 #If TargetMacOS then Dim res As Integer Dim b As Boolean = System.Gestalt( "sysv", res ) If res >= kMacOSXMin Then Return True #EndIf End Function #tag EndMethod #tag Method, Flags = &h0 Function IsMountainLion() As Boolean const kMacOSXMin = &h1080 #If TargetMacOS then Dim res As Integer Dim b As Boolean = System.Gestalt( "sysv", res ) If res >= kMacOSXMin Then Return True #EndIf End Function #tag EndMethod #tag Method, Flags = &h0 Function LabelIndexGet(ForItem as FolderItem) As Integer Dim ae As AppleEvent Dim file As AppleEventObjectSpecifier Dim myPath as string If ForItem = Nil then return 0 ae = NewAppleEvent( "core", "getd", "MACS" ) // The "Get" apple event myPath = ForItem.AbsolutePath file = GetNamedObjectDescriptor( "alis", Nil, myPath ) //"Converts" a file to an AppleEvent object ae.ObjectSpecifierParam( "----" ) = GetPropertyObjectDescriptor( file, "labi" ) //This references the label index property of the "file" object. If NOT ae.Send then End If Return ae.ReplyInteger End Function #tag EndMethod #tag Method, Flags = &h0 Sub LabelIndexSet(ForItem as Folderitem, LabelIndex as Integer) // 0 = Clear // 1 = Orange // 2 = Red // 3 = Yellow // 4 = Blue // 5 = Purple // 6 = Green // 7 = Gray Dim ae As AppleEvent Dim f As FolderItem Dim file As AppleEventObjectSpecifier Dim myPath as string Dim o As AppleEventObjectSpecifier If ForItem = Nil then Return ae = NewAppleEvent( "core", "setd", "MACS" ) //The "Set" apple event myPath = ForItem.AbsolutePath file = GetNamedObjectDescriptor( "alis", Nil, myPath ) //"Converts" a file to an AppleEvent object ae.ObjectSpecifierParam( "----" ) = GetPropertyObjectDescriptor( file, "labi" ) //This references the label index property of the "file" object. ae.IntegerParam("data") = LabelIndex //The label index If Not ae.Send Then End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function LeadingZero(i as Integer, Len as Integer = 2) As String Dim Lead as String = Str( i ) While Lead.Len < Len Lead = "0" + Lead Wend Return Lead End Function #tag EndMethod #tag Method, Flags = &h0 Sub Log(Message as String, LogLevel as Integer = 1003) System.Log LogLevel, Message End Sub #tag EndMethod #tag Method, Flags = &h0 Function match(SrchPattern as String, Source as String, i as Integer = 0) As String Dim rg as New RegEx Dim myMatch as RegExMatch rg.Options.DotMatchAll = True rg.SearchPattern = SrchPattern myMatch = rg.search( Source ) #if DebugBuild then Dim Debug() as String If myMatch <> Nil Then For n as Integer = 0 to myMatch.SubExpressionCount -1 Debug.Append myMatch.SubExpressionString(n) Next End If #endif If myMatch <> Nil And myMatch.SubExpressionCount -1 >= i Then Return Trim( myMatch.SubExpressionString(i) ) End if Exception err as RegExException MsgBox err.message End Function #tag EndMethod #tag Method, Flags = &h0 Function match_all(SrchPattern as String, Source as String, i as Integer = 1) As String() Dim myRegEx As new RegEx Dim myMatch As RegExMatch myRegEx.Options.TreatTargetAsOneLine = True myRegEx.Options.DotMatchAll = True myRegEx.SearchPattern = SrchPattern myRegEx.ReplacementPattern = "" Dim Results() as String Dim Debug() as String // Pop up all matches one by one myMatch = myRegEx.Search( Source ) While myMatch <> Nil #if DebugBuild then For n as Integer = 0 to myMatch.SubExpressionCount - 1 Debug.Append trim( myMatch.SubExpressionString(n) ) Next #endif if myMatch.SubExpressionCount -1 >= i then Results.Append Trim( myMatch.SubExpressionString(i) ) End If Source = myRegEx.Replace( Source ) myMatch = myRegEx.Search() Wend Return Results End Function #tag EndMethod #tag Method, Flags = &h0 Function MsgDlg(w as Window, Type as Integer = 1, headerText as String, subText as String, okCaption as String, cancelCaption as String, otherCaption as String = "") As Integer Dim Msg as New MessageDialog // Declare the MessageDialog object Dim dlgBtn as MessageDialogButton // For handling the result Msg.Icon = Type // Display warning icon // OK Button Msg.ActionButton.Caption = okCaption // Show the "Cancel" button if available If cancelCaption <> "" Then Msg.CancelButton.Caption = cancelCaption Msg.CancelButton.Visible = True End If // Show the "Alternate" button if available If otherCaption <> "" Then Msg.AlternateActionButton.Caption = otherCaption Msg.AlternateActionButton.Visible = True End If Msg.Message = headerText Msg.Explanation = subText If w <> Nil Then dlgBtn = Msg.ShowModalWithin(w) Else dlgBtn = Msg.ShowModal Select Case dlgBtn Case Msg.ActionButton Return 1 Case Msg.AlternateActionButton Return 3 Case Msg.CancelButton Return 2 End Select End Function #tag EndMethod #tag Method, Flags = &h0 Function MyMid(Extends Source as String, StartStr as String, EndStr as String, Start as Integer = 0) As String Dim sx1, sx2 as Integer sx1 = Source.InStr( Start, StartStr ) + StartStr.Len sx2 = Source.InStr( sx1, EndStr ) Return Source.Mid( sx1, sx2 - sx1 ) End Function #tag EndMethod #tag Method, Flags = &h0 Function NameExtension(Extends TheFile as FolderItem) As String Dim FileName as String = TheFile.Name Dim FileSplit() as String = FileName.Split(".") Dim FileExtension as String = FileSplit( FileSplit.Ubound ) Return FileExtension End Function #tag EndMethod #tag Method, Flags = &h0 Function NameWithoutExtension(Extends TheFile as FolderItem) As String Dim FileName as String = TheFile.Name Dim FileSplit() as String = FileName.Split(".") Dim FileExtension as String = FileSplit( FileSplit.Ubound ) Return FileName.Left( FileName.Len - ( FileExtension.Len + 1 ) ) End Function #tag EndMethod #tag Method, Flags = &h0 Function Occurs(Extends cSearchWithin As String, cSearchFor As string) As integer '--- FINDS THE NUMBER OF OCCURENCES OF A STRING WITHIN ANOTHER STRING '--- USES THE NATIVE INSTR() FUNCTION '--- CASE INSENSITIVE '--- '--- Syntax: if Occurs(cSearchFor As String,cSearchWithin As String) > 0 then dim x as Integer = 0 dim nStart As Integer = 1 dim nFound as Integer = 0 while nStart < len(cSearchWithin) x = instr(nStart,cSearchWithin, cSearchFor) if x > 0 then nFound = nFound + 1 nStart = x + 1 Else Exit end wend Return nFound ' Gave it string extention functionallity: ' Use as function: Syntax: if Occurs(cSearchFor As String,cSearchWithin As String) > 0 then ' Or use as extention of string: ' Dim s as String ' if s.Occours(cSearchFor As string) > 0 then End Function #tag EndMethod #tag Method, Flags = &h0 Function ParentVolume(Extends TheFile as FolderItem) As FolderItem Dim Path as String = TheFile.ShellPath.ReplaceAll("\","") If Path.InStr( 0, "volume" ) > 0 Then Dim Pathways() as String = Path.Split("/") If Pathways.Ubound > 1 Then Return GetFolderItem( "/" + Pathways(1) + "/" + Pathways(2), FolderItem.PathTypeShell ) Else Return GetFolderItem( SpecialFolder.Mount.ShellPath + "/" + SpecialFolder.Mount.AbsolutePath.NthField(":",1), FolderItem.PathTypeShell ) End If End Function #tag EndMethod #tag Method, Flags = &h0 Function PictureToHTML(MyPic As Picture) As String Dim s As String = MyPic.GetData(Picture.FormatPNG) s = "" Return s End Function #tag EndMethod #tag Method, Flags = &h0 Function ReadTextFile(f as FolderItem) As String If f = Nil OR NOT f.Exists Then Return "" Dim TextIn as TextInputStream TextIn = TextIn.Open( f ) Dim Content as String = TextIn.ReadAll TextIn.Close Return Content End Function #tag EndMethod #tag Method, Flags = &h0 Function RegExResult(Source as String, SrchPattern as String) As String Dim rg as New RegEx Dim myMatch as RegExMatch rg.Options.DotMatchAll = True rg.SearchPattern = SrchPattern myMatch = rg.search( Source ) If myMatch <> Nil Then Return myMatch.SubExpressionString(0) Else Return "" End if Exception err as RegExException MsgBox err.message End Function #tag EndMethod #tag Method, Flags = &h0 Function RegExResults(Source as String, SrchPattern as String) As String() Dim rg as New RegEx Dim myMatch as RegExMatch rg.Options.DotMatchAll = True rg.SearchPattern = SrchPattern myMatch = rg.search( Source ) Dim Results() as String If myMatch <> Nil Then For i as Integer = 0 to myMatch.SubExpressionCount - 1 Results.Append myMatch.SubExpressionString(i) Next End if Return Results Exception err as RegExException MsgBox err.message End Function #tag EndMethod #tag Method, Flags = &h0 Function RegExThis(Source as String, SrchPattern as String, RplcPattern as String = "") As String // RegEx Dim myRegEx As new RegEx Dim myMatch As RegExMatch myRegEx.Options.TreatTargetAsOneLine = True myRegEx.Options.DotMatchAll = True myRegEx.SearchPattern = SrchPattern myRegEx.ReplacementPattern = RplcPattern // Pop up all matches one by one myMatch = myRegEx.Search( Source ) While myMatch <> Nil Source = myRegEx.Replace( Source ) myMatch = myRegEx.Search() Wend Return Source End Function #tag EndMethod #tag Method, Flags = &h0 Sub Reload(Extends cvs as Canvas, eraseBackground as Boolean = True) #If TargetCocoa Then cvs.Invalidate( eraseBackground ) Return #ElseIf TargetCarbon Then cvs.Refresh( eraseBackground ) Return #EndIf cvs.Invalidate( eraseBackground ) End Sub #tag EndMethod #tag Method, Flags = &h0 Function RemoveDuplicatesFromArray(aList() as String) As String() For i as Integer = 0 to aList.Ubound For n as Integer = i + 1 to aList.Ubound If aList(i) = aList(n) Then aList.Remove(n) Next n Next i For i as Integer = 0 to aList.Ubound For n as Integer = i + 1 to aList.Ubound If aList(i) = aList(n) Then aList.Remove(n) Next n Next i Return aList End Function #tag EndMethod #tag Method, Flags = &h0 Function RemoveLinks(Content as String) As String // RegEx Dim myRegEx As new RegEx Dim myMatch As RegExMatch myRegEx.Options.TreatTargetAsOneLine = True myRegEx.SearchPattern = "" myRegEx.ReplacementPattern = "" // Pop up all matches one by one myMatch = myRegEx.Search( content ) While myMatch <> Nil content = myRegEx.Replace( content ) myMatch = myRegEx.Search() Wend content = content.ReplaceAll( "", "" ) Return Content End Function #tag EndMethod #tag Method, Flags = &h0 Sub SaveImage(img As Picture, TheFile as FolderItem, Type as FileType, Quality as Integer = 65) If img = Nil Then Return If Type = FileTypes.ImageJpeg Then If TheFile <> Nil Then TheFile.Name = TheFile.NameNoExtension + ".jpg" img.Save( TheFile, Picture.SaveAsJPEG, Quality )'Picture.QualityHigh ) ElseIf Type = FileTypes.ImagePng Then If TheFile <> Nil Then TheFile.Name = TheFile.NameNoExtension + ".png" img.Save( TheFile, Picture.SaveAsPNG, Quality )'Picture.QualityMax ) End If If TheFile.LastErrorCode <> 0 Then Return End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SaveText(SaveLocation as FolderItem, Text as String) If SaveLocation IsA object Then Dim TextOut as TextOutputStream = TextOutputStream.Create( SaveLocation ) TextOut.Write Text TextOut.Close End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function ScalingFactor(w as window) As Single 'Return 2 // The ScalingFactor is 2 for a retina MacBook Pro (or other HiDPI modes) and 1 for anything else. If NOT IsMountainLion Then Return 1 #If TargetCocoa Then Declare Function BackingScaleFactor Lib "AppKit" Selector "backingScaleFactor" (target As WindowPtr) as Double Return BackingScaleFactor(w) #Else Return 1 #EndIf End Function #tag EndMethod #tag Method, Flags = &h0 Function SelCol(Extends LstBox as Listbox, Collumn as Integer) As String If LstBox.ListIndex = -1 Then Return "" Return LstBox.Cell( LstBox.ListIndex, Collumn ) End Function #tag EndMethod #tag Method, Flags = &h0 Sub ShareFaceBookLink(URL as String, Title as String) Dim s as string = "http://www.facebook.com/sharer.php?u=@URL&t=@Title" s = s.ReplaceAll("@URL", URL) s = s.ReplaceAll("@Title", Title) ShowURL s End Sub #tag EndMethod #tag Method, Flags = &h0 Sub ShareTweet(Message as String, ScreenName as String = "") 'Dim s as String = "https://twitter.com/intent/tweet?original_referer=https%3A%2F%2Ftwitter.com%2Fabout%2Fresources%2Fbuttons&screen_name=@support&source=tweetbutton&text=$Message" Dim s as String = "https://twitter.com/intent/tweet?source=ViMediaManager&screen_name=@support&text=$Message" s = s.ReplaceAll( "@Support", ScreenName ) s = s.ReplaceAll( "$Message", Message.ReplaceAll( " ", "%20" ) ) ShowURL s End Sub #tag EndMethod #tag Method, Flags = &h0 Function ShellCommand(Command as String) As String dim sh as New Shell sh.Execute(Command) if sh.ErrorCode = 0 then return sh.ReadAll end if End Function #tag EndMethod #tag Method, Flags = &h21 Private Sub ShowInFinder(Extends f as Folderitem) If f = Nil or NOT f.Exists Then Return 'If f.AbsolutePath = SpecialFolder.Desktop.AbsolutePath Then Return Dim MyShell as New Shell Dim cmd as String #If TargetMacOS Then cmd = "osascript -e 'Tell application ""Finder"" to reveal """ + f.AbsolutePath.ReplaceAll("'", "'\''") + """' -e 'Tell application ""Finder"" to activate'" MyShell.Execute( cmd ) #ElseIf TargetWin32 Then cmd = "explorer.exe /select,"+ chr(34) + f.AbsolutePath + chr(34) MyShell.Execute( cmd ) #EndIf If DebugBuild And MyShell.Result <> "" Then MessageBox MyShell.Result End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SmoothResize(w as Window, Width as Integer, Height as Integer, align as Integer) // Added 11/13/2001 by Jarvis Badgley // Edited 12/05/2001 by Jarvis Badgley // Modified 2/3/2002 by Kevin Ballard // --- // Rewritten 2/22/2002 by Kevin Ballard // Based off of code by Jean-Francois Roy // --- // Modified 8/23/02 by Kevin Ballard // Modified 12/14/02 by Pedro fp // Modified 12/14/02 by Kevin Ballard // // Align numbers: // 0) Lock upper left // 1) Lock upper right // 2) Lock lower left // 3) Lock lower right // 4) Lock top center // 5) Lock left center // 6) Lock bottom center // 7) Lock right center #If targetmacos then Dim err, t, l as Integer Dim rect as MemoryBlock #If TargetCarbon then Declare Function TransitionWindow Lib CarbonLib (window as WindowPtr, effect as Integer, action as Integer, rect as Ptr) as Integer Declare Function GetWindowBounds Lib CarbonLib (window As WindowPtr, regionCode As Integer, globalBounds As Ptr) as Integer #ElseIf TargetCocoa then Declare Function TransitionWindow Lib CocoaLib (window as WindowPtr, effect as Integer, action as Integer, rect as Ptr) as Integer Declare Function GetWindowBounds Lib CocoaLib (window As WindowPtr, regionCode As Integer, globalBounds As Ptr) as Integer // Vidal: Cheating using MBS plugin. w.SmoothResizeMBS( Width, Height ) w.Width = Width w.Height = Height Return #ElseIf TargetWin32 Declare Function TransitionWindow Lib "WindowsLib" (window as WindowPtr, effect as Integer, action as Integer, rect as Ptr) as Integer Declare Function GetWindowBounds Lib "WindowsLib" (window As WindowPtr, regionCode As Integer, globalBounds As Ptr) as Integer #EndIf // we get the old window region rect = New MemoryBlock(8) err = GetWindowBounds(w, 32, rect) t = w.Top // Need to know where the top and left of the window go l = w.Left Select Case align // Use deltas in measurements, not absolutes Case 0 // Lock upper left rect.Short(4) = rect.Short(4) + (height - w.height) rect.Short(6) = rect.Short(6) + (width - w.width) Case 1 // Lock upper right rect.Short(2) = rect.Short(2) - (width - w.width) rect.Short(4) = rect.Short(4) + (height - w.height) l = l - (width - w.width) // Left side moves Case 2 // Lock lower left rect.Short(0) = rect.Short(0) - (height - w.height) rect.Short(6) = rect.Short(6) + (width - w.width) t = t - (height - w.height) // Top side moves Case 3 // Lock lower right rect.Short(0) = rect.Short(0) - (height - w.height) rect.Short(2) = rect.Short(2) - (width - w.width) t = t - (height - w.height) // Top side moves l = l - (width - w.width) // Left side moves Case 4 // Lock top center rect.Short(2) = rect.Short(2) - (width - w.width) / 2 rect.Short(4) = rect.Short(4) + (height - w.height) rect.Short(6) = rect.Short(6) + (width - w.width) / 2 l = l - (width - w.width)/2 // Both sides move Case 5 // Lock left center rect.Short(0) = rect.Short(0) - (height - w.height) / 2 rect.Short(4) = rect.Short(4) + (height - w.height) / 2 rect.Short(6) = rect.Short(6) + (width - w.width) t = t - (height - w.height) / 2 // Top moves Case 6 // Lock bottom center rect.Short(0) = rect.Short(0) - (height - w.height) rect.Short(2) = rect.Short(2) - (width - w.width) / 2 rect.Short(6) = rect.Short(6) + (width - w.width) / 2 t = t - (height - w.height) // Top moves l = l - (width - w.width) / 2 // Left moves Case 7 // Lock right center rect.Short(0) = rect.Short(0) - (height - w.height) / 2 rect.Short(2) = rect.Short(2) - (width - w.width) rect.Short(4) = rect.Short(4) + (height - w.height) / 2 t = t - (height - w.height) / 2// Top moves l = l - (width - w.width) // Left moves End Select // If none of these, don't change // transition err = TransitionWindow(w, 3, 4, rect) // have to manually set the window's new height after resizing the window w.Top = t w.Left = l w.Width = width w.Height = height w.Refresh #endif #if TargetWin32 then w.width=width w.height=height #endif End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SocketError(Code as Integer, sckt as HTTPSocket) //HTTPSocket error codes and user notification Dim ErrorString As String ErrorString = "HTTP Error: " + str(code) + " occured." + chr(13) + chr(13) Select case code case 100 ErrorString = ErrorString + "Driver error" case 102 ErrorString = ErrorString + "Connection Lost" + Loc.kDownloadFailed case 103 ErrorString = ErrorString + "Unresolved Host, " + Loc.kCheckInternetConnection.Lowercase case 105 ErrorString = ErrorString + "Port Bind Error" case 106 ErrorString = ErrorString + "Invalid Socket State" case 107 ErrorString = ErrorString + "Invalid Port" case 108 ErrorString = ErrorString + "Out Of Memory" case 400 ErrorString = ErrorString + "Bad Request" case 401 ErrorString = ErrorString + "Unauthorized" case 414 ErrorString = ErrorString + "Request-URI Too Long" case 500 ErrorString = ErrorString + "Internal Server Error" case 505 ErrorString = ErrorString + "HTTP Version Not Supported" case 509 ErrorString = ErrorString + "Bandwidth Limit Exceeded" else ErrorString = ErrorString + "Unknown or Undefined. Error Code" end Select 'wndProgress.Close 'If CommonCore.MassSearch Then If NOT nc.Available then if NOT Growl.Notify( App.kAppName, ErrorString ) then if NOT CommonCore.MassSearch Then MessageBox ErrorString end if Else nc.Message ErrorString End If 'Else 'MessageBox ErrorString 'End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function String2Entities(s as String) As String 's = s.ReplaceAll(" ", "+" ) 's = s.ReplaceAll("&", "%26") 's = s.ReplaceAll("Ärk", "%C4") 's = s.ReplaceAll("Ërk", "%CB") 's = s.ReplaceAll("Ïrk", "%CF") 's = s.ReplaceAll("Ð", "E") 's = s.ReplaceAll("Örk", "%D6") 's = s.ReplaceAll("×", "") 's = s.ReplaceAll("Ürk", "%DC") 's = s.ReplaceAll("Þ", "") 's = s.ReplaceAll("Þ", "%DE") 's = s.ReplaceAll("ß", "") 's = s.ReplaceAll("ð", "%F0") 's = s.ReplaceAll("÷", "") 's = s.ReplaceAll("÷", "%F7") 's = s.ReplaceAll("þ", "") 's = s.ReplaceAll("þ", "%FE") // ---- 's = s.ReplaceAll("Ḁ", "A") 's = s.ReplaceAll("ḉ", "c") 's = s.ReplaceAll("Ḟ", "F") 's = s.ReplaceAll("Ḡ", "G") 's = s.ReplaceAll("Ḣ", "H") 's = s.ReplaceAll("Ḥ", "H") 's = s.ReplaceAll("Ḧ", "H") 's = s.ReplaceAll("Ṙ", "R") 's = s.ReplaceAll("Ṡ", "S") 's = s.ReplaceAll("Ṣ", "S") 's = s.ReplaceAll("Ṥ", "S") 's = s.ReplaceAll("Ṧ", "S") 's = s.ReplaceAll("Ṵ", "U") 's = s.ReplaceAll("Ṽ", "V") 's = s.ReplaceAll("Ẁ", "W") 's = s.ReplaceAll("Ẃ", "W") 's = s.ReplaceAll("Ẅ", "W") 's = s.ReplaceAll("Ẇ", "W") 's = s.ReplaceAll("Ẑ", "Z") 's = s.ReplaceAll("Ả", "A") 's = s.ReplaceAll("Ẻ", "E") 's = s.ReplaceAll("Ẽ", "E") 's = s.ReplaceAll("Ề", "E") 's = s.ReplaceAll("Ỉ", "I") 's = s.ReplaceAll("À", "A") 's = s.ReplaceAll("Á", "A") 's = s.ReplaceAll("Â", "A") 's = s.ReplaceAll("Ã", "A") 's = s.ReplaceAll("Ä", "A") 's = s.ReplaceAll("Å", "A") 's = s.ReplaceAll("Æ", "AE") 's = s.ReplaceAll("Ç", "C") 's = s.ReplaceAll("È", "E") 's = s.ReplaceAll("É", "E") 's = s.ReplaceAll("Ê", "E") 's = s.ReplaceAll("Ë", "E") 's = s.ReplaceAll("Ì", "I") 's = s.ReplaceAll("Í", "I") 's = s.ReplaceAll("Î", "I") 's = s.ReplaceAll("Ï", "I") 's = s.ReplaceAll("Ñ", "N") 's = s.ReplaceAll("Ò", "O") 's = s.ReplaceAll("Ó", "O") 's = s.ReplaceAll("Ô", "O") 's = s.ReplaceAll("Õ", "O") 's = s.ReplaceAll("Ö", "O") 's = s.ReplaceAll("Ø", "O") 's = s.ReplaceAll("Ù", "U") 's = s.ReplaceAll("Ú", "U") 's = s.ReplaceAll("Û", "U") 's = s.ReplaceAll("õ", "o") 's = s.ReplaceAll("Ü", "U") 's = s.ReplaceAll("Ý", "Y") 's = s.ReplaceAll("ßre", "s") 's = s.ReplaceAll("à", "a") 's = s.ReplaceAll("á", "a") 's = s.ReplaceAll("â", "a") 's = s.ReplaceAll("ã", "a") 's = s.ReplaceAll("ä", "a") 's = s.ReplaceAll("å", "a") 's = s.ReplaceAll("æ", "ae") 's = s.ReplaceAll("ç", "c") 's = s.ReplaceAll("è", "e") 's = s.ReplaceAll("é", "e") 's = s.ReplaceAll("ê", "e") 's = s.ReplaceAll("ë", "e") 's = s.ReplaceAll("ì", "i") 's = s.ReplaceAll("í", "i") 's = s.ReplaceAll("î", "i") 's = s.ReplaceAll("ï", "i") 's = s.ReplaceAll("ð", "d") 's = s.ReplaceAll("ñ", "n") 's = s.ReplaceAll("ò", "o") 's = s.ReplaceAll("ó", "o") 's = s.ReplaceAll("ô", "o") 's = s.ReplaceAll("ö", "o") 's = s.ReplaceAll("ø", "o") 's = s.ReplaceAll("ù", "u") 's = s.ReplaceAll("ú", "u") 's = s.ReplaceAll("û", "u") 's = s.ReplaceAll("ü", "u") 's = s.ReplaceAll("ý", "y") 's = s.ReplaceAll("ÿ", "y") 's = s.ReplaceAll("Ā", "A") 's = s.ReplaceAll("Ă", "A") 's = s.ReplaceAll("Ą", "A") 's = s.ReplaceAll("Ć", "C") 's = s.ReplaceAll("ć", "c") 's = s.ReplaceAll("ĉ", "c") 's = s.ReplaceAll("Č", "C") 's = s.ReplaceAll("Ē", "E") 's = s.ReplaceAll("Ĕ", "E") 's = s.ReplaceAll("Ė", "E") 's = s.ReplaceAll("Ě", "E") 's = s.ReplaceAll("Ĝ", "G") 's = s.ReplaceAll("Ğ", "G") 's = s.ReplaceAll("Ġ", "G") 's = s.ReplaceAll("Ĥ", "H") 's = s.ReplaceAll("Ĩ", "I") 's = s.ReplaceAll("Ŏ", "O") 's = s.ReplaceAll("Ő", "O") 's = s.ReplaceAll("Ŕ", "R") 's = s.ReplaceAll("Ř", "R") 's = s.ReplaceAll("Ś", "S") 's = s.ReplaceAll("Ŝ", "S") 's = s.ReplaceAll("Ş", "S") 's = s.ReplaceAll("Š", "S") 's = s.ReplaceAll("Ũ", "U") 's = s.ReplaceAll("Ů", "U") 's = s.ReplaceAll("ů", "u") 's = s.ReplaceAll("Ű", "U") 's = s.ReplaceAll("Ų", "U") 's = s.ReplaceAll("Ź", "Z") 's = s.ReplaceAll("Ż", "Z") 's = s.ReplaceAll("Ž", "Z") 's = s.ReplaceAll("Ɛ", "E") 's = s.ReplaceAll("Ǎ", "A") 's = s.ReplaceAll("Ǒ", "O") 's = s.ReplaceAll("Ǔ", "U") 's = s.ReplaceAll("Ǧ", "G") 's = s.ReplaceAll("Ǵ", "G") 's = s.ReplaceAll("ǽ", "ae") 's = s.ReplaceAll("Ȁ", "A") 's = s.ReplaceAll("Ȃ", "A") 's = s.ReplaceAll("Ȅ", "E") 's = s.ReplaceAll("Ȇ", "E") 's = s.ReplaceAll("Ȍ", "O") 's = s.ReplaceAll("Ȑ", "R") 's = s.ReplaceAll("Ȓ", "R") 's = s.ReplaceAll("Ȕ", "U") 's = s.ReplaceAll("Ș", "S") 's = s.ReplaceAll("Ȟ", "H") 's = s.ReplaceAll("Ȧ", "A") 's = s.ReplaceAll("Ȩ", "E") // ---- 's = s.ReplaceAll("%", "%25") 's = s.ReplaceAll("?", "%3F") 's = s.ReplaceAll("=", "%3D") 's = s.ReplaceAll("@", "%40") ''s = s.ReplaceAll("/", "%2F") 's = s.ReplaceAll("À", "%C0") 's = s.ReplaceAll("Á", "%C1") 's = s.ReplaceAll("Â", "%C2") 's = s.ReplaceAll("Ã", "%C3") 's = s.ReplaceAll("Ärk", "%C4") 's = s.ReplaceAll("Å", "%C5") 's = s.ReplaceAll("Æ", "%C6") 's = s.ReplaceAll("Ç", "%C7") 's = s.ReplaceAll("È", "%C8") 's = s.ReplaceAll("É", "%C9") 's = s.ReplaceAll("Ê", "%CA") 's = s.ReplaceAll("Ërk", "%CB") 's = s.ReplaceAll("Ì", "%CC") 's = s.ReplaceAll("Í", "%CD") 's = s.ReplaceAll("Î", "%CE") 's = s.ReplaceAll("Ïrk", "%CF") 's = s.ReplaceAll("Ð", "%D0") 's = s.ReplaceAll("Ñ", "%D1") 's = s.ReplaceAll("Ò", "%D2") 's = s.ReplaceAll("Ó", "%D3") 's = s.ReplaceAll("Ô", "%D4") 's = s.ReplaceAll("Õ", "%D5") 's = s.ReplaceAll("Örk", "%D6") 's = s.ReplaceAll("×", "%D7") 's = s.ReplaceAll("Ø", "%D8") 's = s.ReplaceAll("Ù", "%D9") 's = s.ReplaceAll("Ú", "%DA") 's = s.ReplaceAll("Û", "%DB") 's = s.ReplaceAll("Ürk", "%DC") 's = s.ReplaceAll("Ý", "%DD") 's = s.ReplaceAll("Þ", "%DE") 's = s.ReplaceAll("ßre", "%DF") 's = s.ReplaceAll("à", "%E0") 's = s.ReplaceAll("á", "%E1") 's = s.ReplaceAll("â", "%E2") 's = s.ReplaceAll("ã", "%E3") 's = s.ReplaceAll("ä", "%E4") 's = s.ReplaceAll("å", "%E5") 's = s.ReplaceAll("æ", "%E6") 's = s.ReplaceAll("ç", "%E7") 's = s.ReplaceAll("è", "%E8") 's = s.ReplaceAll("é", "%E9") 's = s.ReplaceAll("ê", "%EA") 's = s.ReplaceAll("ë", "%EB") 's = s.ReplaceAll("ì", "%EC") 's = s.ReplaceAll("í", "%ED") 's = s.ReplaceAll("î", "%EE") 's = s.ReplaceAll("ï", "%EF") 's = s.ReplaceAll("ð", "%F0") 's = s.ReplaceAll("ñ", "%F1") 's = s.ReplaceAll("ò", "%F2") 's = s.ReplaceAll("ó", "%F3") 's = s.ReplaceAll("ô", "%F4") 's = s.ReplaceAll("õ", "%F5") 's = s.ReplaceAll("ö", "%F6") 's = s.ReplaceAll("÷", "%F7") 's = s.ReplaceAll("ø", "%F8") 's = s.ReplaceAll("ù", "%F9") 's = s.ReplaceAll("ú", "%FA") 's = s.ReplaceAll("û", "%FB") 's = s.ReplaceAll("ü", "%FC") 's = s.ReplaceAll("ý", "%FD") 's = s.ReplaceAll("þ", "%FE") 's = s.ReplaceAll("ÿ", "%FF") s = ConvertEncoding( s, Encodings.ASCII ) // Unicode characters such as 'é' will be renamed to e%CC%81, etc. 's = EncodingToURLMBS( s ) s = URLEncode( s ) 'return s // Saving characters that shouldn't be filtered out. s = s.ReplaceAll("%3A", ":") s = s.ReplaceAll("%28", "(") s = s.ReplaceAll("%29", ")") 's = s.ReplaceAll("%27", "'") s = s.ReplaceAll("%26", "&") s = s.ReplaceAll("%25", "") s = s.ReplaceAll("%20", " ") s = s.ReplaceAll("%2D", "-") s = s.ReplaceAll("%2F", "/") // Filter out the 'unicode' characters %CC, etc. Dim Character() as String = s.Split("") Dim Unicode() as String For i as Integer = s.Len - 1 DownTo 0 If Character(i) = "%" Then Unicode.append s.Mid( i + 1, 3 ) Next For i as Integer = 0 to Unicode.Ubound s = s.ReplaceAll( Unicode(i), "" ) Next // Re-placing characters back into the name. s = s.ReplaceAll( "", "%") s = s.ReplaceAll( " ", "%20" ) s = s.ReplaceAll( "&", "%26" ) s = s.ReplaceAll( "/", "%2F" ) Return s End Function #tag EndMethod #tag Method, Flags = &h0 Function StringToHex(src as string, separator as string) As string Dim n, L, v as integer Dim s as string L = LenB(src) For n=1 to L v = AscB(MidB(src, n, 1)) s = s + RightB("00"+Hex(v),2)+separator Next Return LeftB(s, LenB(s)-LenB(separator)) End Function #tag EndMethod #tag Method, Flags = &h0 Function SymLink(TheFile as FolderItem, Destination as FolderItem) As Boolean If TheFile = Nil OR NOT TheFile.Exists Then Return False If Destination = Nil OR Destination.Exists Then Return False Dim ExeStr as String = "ln -s " + TheFile.ShellPath + " " + Destination.ShellPath Dim sh as New Shell sh.Execute ExeStr Return sh.ReadAll = "" End Function #tag EndMethod #tag Method, Flags = &h0 Sub URL2Picture(URL as String, f as FolderItem = Nil, FileName as String = "") dim TheFile as FolderItem if FileName = "" then dim name() as String = URL.Split("/") FileName = name( name.Ubound ) end if if f <> Nil then TheFile = f.Child(FileName) else TheFile = SpecialFolder.Temporary.Child( app.Identifier ).Child(FileName) end if if TheFile <> Nil and URL <> "" then if f <> Nil and TheFile.Exists then // Don't overwrite existing elseif System.Network.IsConnected then if TheFile.Exists then TheFile.Delete dim sh as new Shell sh.Execute "curl -s " + URL + " > " + TheFile.ShellPath end if 'Return Picture.Open( TheFile ) end if End Sub #tag EndMethod #tag Method, Flags = &h0 Function URL2Picture(URL as String, f as FolderItem = Nil, FileName as String = "") As Picture dim TheFile as FolderItem if FileName = "" then dim name() as String = URL.Split("/") FileName = name( name.Ubound ) end if if f <> Nil then TheFile = f.Child(FileName) else TheFile = SpecialFolder.Temporary.Child( app.Identifier ).Child(FileName) end if if TheFile <> Nil and URL <> "" then if f <> Nil and TheFile.Exists then // Don't overwrite existing elseif System.Network.IsConnected then if TheFile.Exists then TheFile.Delete dim sh as new Shell sh.Execute "curl -s " + URL + " > " + TheFile.ShellPath end if Return Picture.Open( TheFile ) end if End Function #tag EndMethod #tag Method, Flags = &h0 Sub URL2PictureOLD(URL as String, f as FolderItem = Nil, FileName as String = "") Dim sckt as new HTTPSocket Dim TheFile as FolderItem Dim FileSaved as Boolean sckt.Yield = True // URL = String2Entities( URL ) If FileName = "" Then Dim Name() as String = URL.Split("/") FileName = Name( Name.Ubound ) End If If f <> Nil then TheFile = f.Child( FileName ) Else TheFile = SpecialFolder.Temporary.Child( App.Identifier ).Child( FileName ) End If If TheFile <> Nil and URL <> "" then // Save file if one doesn't exist already. If f <> Nil and TheFile.Exists then FileSaved = True // Don't want to overwrite existing images. ElseIf System.Network.IsConnected then If TheFile.Exists then TheFile.Delete FileSaved = sckt.Get( URL, TheFile, Prefs.integerForKey("TimeOut") ) sckt.Close End If If NOT FileSaved then Dim FileSystemErrorCode as Integer = sckt.LastErrorCode // sckt.Close // For extra measure If TheFile.Exists then TheFile.Delete // Don't leave partially downloaded files. // Notify If nc.Available Then nc.Notify( f.Parent.Name, "", Loc.kConnectionTimedOut ) Else If NOT Growl.Notify( f.Parent.Name + " Error: " + str( FileSystemErrorCode ), Loc.kConnectionTimedOut ) Then MessageBox f.Parent.Name + " Error: " + str( FileSystemErrorCode ) + chr(13) + chr(13) + Loc.kConnectionTimedOut End If End If Return Else // sckt.Close // For extra measure 'Return Picture.Open( TheFile ) End If End If End Sub #tag EndMethod #tag Method, Flags = &h0 Function URL2PictureOLD(URL as String, f as FolderItem = Nil, FileName as String = "") As Picture Dim sckt as new HTTPSocket Dim TheFile as FolderItem Dim FileSaved as Boolean sckt.Yield = True // URL = String2Entities( URL ) If FileName = "" Then Dim Name() as String = URL.Split("/") FileName = Name( Name.Ubound ) End If If f <> Nil then TheFile = f.Child( FileName ) Else TheFile = SpecialFolder.Temporary.Child( App.Identifier ).Child( FileName ) End If If TheFile <> Nil and URL <> "" then // Save file if one doesn't exist already. If f <> Nil and TheFile.Exists then FileSaved = True // Don't want to overwrite existing images. ElseIf System.Network.IsConnected then If TheFile.Exists then TheFile.Delete FileSaved = sckt.Get( URL, TheFile, Prefs.integerForKey("TimeOut") ) sckt.Close End If If NOT FileSaved then Dim FileSystemErrorCode as Integer = sckt.LastErrorCode // sckt.Close // For extra measure If TheFile.Exists Then TheFile.Delete // Don't leave partially downloaded files. // Notify If nc.Available Then nc.Notify( f.Parent.Name, "", Loc.kConnectionTimedOut ) Else If NOT Growl.Notify( f.Parent.Name + " Error: " + str( FileSystemErrorCode ), Loc.kConnectionTimedOut ) Then MessageBox f.Parent.Name + " Error: " + str( FileSystemErrorCode ) + chr(13) + chr(13) + Loc.kConnectionTimedOut End If End If Return Nil Else // sckt.Close // For extra measure Return Picture.Open( TheFile ) End If End If End Function #tag EndMethod #tag Method, Flags = &h0 Function URLDecode(s as String) As String Dim TempAns As String Dim CurChr As Integer CurChr = 1 Do Until CurChr - 1 = Len(s) Select Case Mid(s, CurChr, 1) Case "+" TempAns = TempAns + " " Case "%" TempAns = TempAns + Chr(Val("&h" + Mid(s, CurChr + 1, 2))) CurChr = CurChr + 2 Case Else TempAns = TempAns + Mid(s, CurChr, 1) End Select CurChr = CurChr + 1 Loop Return TempAns End Function #tag EndMethod #tag Method, Flags = &h0 Function URLEncode(s as String) As String Dim TempAns As String Dim CurChr As Integer CurChr = 1 Do Until CurChr - 1 = Len(s) Select Case Asc(Mid(s, CurChr, 1)) Case 48 To 57, 65 To 90, 97 To 122 TempAns = TempAns + Mid(s, CurChr, 1) Case 32 TempAns = TempAns + "%" + Hex(32) Case Else TempAns = TempAns +"%" + Right("0" + Hex(Asc(Mid(s, CurChr, 1))), 2) End Select CurChr = CurChr + 1 Loop Return TempAns End Function #tag EndMethod #tag Method, Flags = &h0 Sub WriteTextFile(Content as String, f as FolderItem) If f = Nil OR f.Parent = Nil OR NOT f.Parent.Exists Then Return Dim TextOut as TextOutputStream If f.Parent.IsWriteable Then Try TextOut = TextOut.Create( f ) TextOut.Write( Content ) TextOut.Close Catch err as IOException MessageBox "I do not have permission to write to """ + f.Parent.Name + """." Return End Try Else MessageBox "I Don't have permission to write to """ + f.Parent.Name + """." End If exception err as IOException App.ErrorMessage = "An IO exception occurred ERROR No: " + Str( err.ErrorNumber ) + chr(13) + chr(13) + _ "Couldn't write " + f.name + " to location " + f.Parent.Name + "." + chr(13) + _ "Do we have permission to write to this location?" Dim w as New wndBugReporter w.Init( err, "WriteTextFile - " + chr(13) + App.ErrorMessage ) App.ErrorMessage = "" TextOut.Close Return Exception Err as NilObjectException If f.Parent = Nil Then App.ErrorMessage = "I can't write to the specified location" Dim w as New wndBugReporter w.Init( err, "WriteTextFile - " + f.ShellPath.ReplaceAll("\","") + Chr(13) + app.ErrorMessage ) App.ErrorMessage = "" Return End Sub #tag EndMethod #tag Constant, Name = CarbonLib, Type = String, Dynamic = False, Default = \"Carbon.framework", Scope = Public #tag EndConstant #tag Constant, Name = CocoaLib, Type = String, Dynamic = False, Default = \"Cocoa.framework", Scope = Public #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Index" Visible=true Group="ID" InitialValue="-2147483648" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag EndViewBehavior End Module #tag EndModule \ No newline at end of file diff --git a/ViMM/Modules/HTMLEntities/HTMLEntities.rbbas b/ViMM/Modules/HTMLEntities/HTMLEntities.rbbas new file mode 100644 index 0000000..46e2eb1 --- /dev/null +++ b/ViMM/Modules/HTMLEntities/HTMLEntities.rbbas @@ -0,0 +1 @@ +#tag Module Protected Module HTMLEntities #tag Method, Flags = &h21 Private Function ArrayPopulated() As Boolean return (entities(0) <> nil) End Function #tag EndMethod #tag Method, Flags = &h0 Function EscapeHTML(Extends Input As String) As String return EscapeHTML(Input) End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function EscapeHTML(Input As String) As String TestHTMLDictionary dim newString(-1),c,s as string dim i as integer redim newString(len(input)) for i = 0 to len(input) s = mid(input,i,1) c = reversehtmlcharacter(s) if c <> s then c = "&" + c + ";" end newstring(i) = c next return join(newstring,"") End Function #tag EndMethod #tag Method, Flags = &h21 Private Function GetCharacterForSymbol(Symbol As String) As String dim i as integer for i = 0 to ubound(entities) if strcomp(entities(i).symbol,symbol,0) = 0 then return entities(i).character end next return symbol End Function #tag EndMethod #tag Method, Flags = &h21 Private Function GetSymbolForCharacter(Character As String) As String if character <> " " then dim i as integer for i = 0 to ubound(entities) if strcomp(entities(i).character,character,0) = 0 then return entities(i).symbol end next return character else return character end End Function #tag EndMethod #tag Method, Flags = &h21 Private Function ReverseHTMLCharacter(Input As String) As String TestHTMLDictionary if len(input) = 1 then return GetSymbolForCharacter(Input) else return GetCharacterForSymbol(Input) end End Function #tag EndMethod #tag Method, Flags = &h21 Private Sub TestHTMLDictionary() if not ArrayPopulated then Entities(0) = New HTMLEntity("""","quot") Entities(1) = New HTMLEntity("&","amp") Entities(2) = New HTMLEntity("<","lt") Entities(3) = New HTMLEntity(">","gt") Entities(4) = New HTMLEntity("™","trade") Entities(5) = New HTMLEntity("¡","iexcl") Entities(6) = New HTMLEntity("¢","cent") Entities(7) = New HTMLEntity("£","pound") Entities(8) = New HTMLEntity("¤","curren") Entities(9) = New HTMLEntity("¥","yen") Entities(10) = New HTMLEntity("¦","brvbar") Entities(11) = New HTMLEntity("§","sect") Entities(12) = New HTMLEntity("¨","uml") Entities(13) = New HTMLEntity("©","copy") Entities(14) = New HTMLEntity("ª","ordf") Entities(15) = New HTMLEntity("«","laquo") Entities(16) = New HTMLEntity("¬","not") Entities(17) = New HTMLEntity("­","shy") Entities(18) = New HTMLEntity("®","reg") Entities(19) = New HTMLEntity("¯","macr") Entities(20) = New HTMLEntity("°","deg") Entities(21) = New HTMLEntity("±","plusmn") Entities(22) = New HTMLEntity("²","sup2") Entities(23) = New HTMLEntity("³","sup3") Entities(24) = New HTMLEntity("´","acute") Entities(25) = New HTMLEntity("µ","micro") Entities(26) = New HTMLEntity("¶","para") Entities(27) = New HTMLEntity("·","middot") Entities(28) = New HTMLEntity("¸","cedil") Entities(29) = New HTMLEntity("¹","sup1") Entities(30) = New HTMLEntity("º","ordm") Entities(31) = New HTMLEntity("»","raquo") Entities(32) = New HTMLEntity("¼","frac14") Entities(33) = New HTMLEntity("½","frac12") Entities(34) = New HTMLEntity("¾","frac34") Entities(35) = New HTMLEntity("¿","iquest") Entities(36) = New HTMLEntity("à","Agrave") Entities(37) = New HTMLEntity("Á","Aacute") Entities(38) = New HTMLEntity("Â","Acirc") Entities(39) = New HTMLEntity("Ã","Atilde") Entities(40) = New HTMLEntity("Ä","Auml") Entities(41) = New HTMLEntity("Å","Aring") Entities(42) = New HTMLEntity("Æ","AElig") Entities(43) = New HTMLEntity("Ç","Ccedil") Entities(44) = New HTMLEntity("È","Egrave") Entities(45) = New HTMLEntity("É","Eacute") Entities(46) = New HTMLEntity("Ê","Ecirc") Entities(47) = New HTMLEntity("Ë","Euml") Entities(48) = New HTMLEntity("Ì","Igrave") Entities(49) = New HTMLEntity("Í","Iacute") Entities(50) = New HTMLEntity("Î","Icirc") Entities(51) = New HTMLEntity("Ï","Iuml") Entities(52) = New HTMLEntity("ð","eth") Entities(53) = New HTMLEntity("Ñ","Ntilde") Entities(54) = New HTMLEntity("Ò","Ograve") Entities(55) = New HTMLEntity("Ó","Oacute") Entities(56) = New HTMLEntity("Ô","Ocirc") Entities(57) = New HTMLEntity("Õ","Otilde") Entities(58) = New HTMLEntity("Ö","Ouml") Entities(59) = New HTMLEntity("×","times") Entities(60) = New HTMLEntity("Ø","Oslash") Entities(61) = New HTMLEntity("Ù","Ugrave") Entities(62) = New HTMLEntity("Ú","Uacute") Entities(63) = New HTMLEntity("Û","Ucirc") Entities(64) = New HTMLEntity("Ü","Uuml") Entities(65) = New HTMLEntity("Ý","Yacute") Entities(66) = New HTMLEntity("þ","thorn") Entities(67) = New HTMLEntity("ß","szlig") Entities(68) = New HTMLEntity("à","agrave") Entities(69) = New HTMLEntity("á","aacute") Entities(70) = New HTMLEntity("â","acirc") Entities(71) = New HTMLEntity("ã","atilde") Entities(72) = New HTMLEntity("ä","auml") Entities(73) = New HTMLEntity("å","aring") Entities(74) = New HTMLEntity("æ","aelig") Entities(75) = New HTMLEntity("ç","ccedil") Entities(76) = New HTMLEntity("è","egrave") Entities(77) = New HTMLEntity("é","eacute") Entities(78) = New HTMLEntity("ê","ecirc") Entities(79) = New HTMLEntity("ë","euml") Entities(80) = New HTMLEntity("ì","igrave") Entities(81) = New HTMLEntity("í","iacute") Entities(82) = New HTMLEntity("î","icirc") Entities(83) = New HTMLEntity("ï","iuml") Entities(84) = New HTMLEntity("ð","eth") Entities(85) = New HTMLEntity("ñ","ntilde") Entities(86) = New HTMLEntity("ò","ograve") Entities(87) = New HTMLEntity("ó","oacute") Entities(88) = New HTMLEntity("ô","ocirc") Entities(89) = New HTMLEntity("õ","otilde") Entities(90) = New HTMLEntity("ö","ouml") Entities(91) = New HTMLEntity("÷","divide") Entities(92) = New HTMLEntity("ø","oslash") Entities(93) = New HTMLEntity("ù","ugrave") Entities(94) = New HTMLEntity("ú","uacute") Entities(95) = New HTMLEntity("û","ucirc") Entities(96) = New HTMLEntity("ü","uuml") Entities(97) = New HTMLEntity("ý","yacute") Entities(98) = New HTMLEntity("þ","thorn") Entities(99) = New HTMLEntity("ÿ","yuml") Entities(100) = New HTMLEntity("Α","Alpha") Entities(101) = New HTMLEntity("Β","Beta") Entities(102) = New HTMLEntity("Γ","Gamma") Entities(103) = New HTMLEntity("Δ","Delta") Entities(104) = New HTMLEntity("Ε","Epsilon") Entities(105) = New HTMLEntity("Ζ","Zeta") Entities(106) = New HTMLEntity("Η","Eta") Entities(107) = New HTMLEntity("Θ","Theta") Entities(108) = New HTMLEntity("Ι","Iota") Entities(109) = New HTMLEntity("Κ","Kappa") Entities(110) = New HTMLEntity("Λ","Lambda") Entities(111) = New HTMLEntity("Η","Eta") Entities(112) = New HTMLEntity("Θ","Theta") Entities(113) = New HTMLEntity("Ι","Iota") Entities(114) = New HTMLEntity("Κ","Kappa") Entities(115) = New HTMLEntity("Λ","Lambda") Entities(116) = New HTMLEntity("Μ","Mu") Entities(117) = New HTMLEntity("Ν","Nu") Entities(118) = New HTMLEntity("Ξ","Xi") Entities(119) = New HTMLEntity("Ο","Omicron") Entities(120) = New HTMLEntity("Π","Pi") Entities(121) = New HTMLEntity("Ρ","Rho") Entities(122) = New HTMLEntity("Σ","Sigma") Entities(123) = New HTMLEntity("Τ","Tau") Entities(124) = New HTMLEntity("Υ","Upsilon") Entities(125) = New HTMLEntity("Φ","Phi") Entities(126) = New HTMLEntity("Χ","Chi") Entities(127) = New HTMLEntity("Ψ","Psi") Entities(128) = New HTMLEntity("Ω","Omega") Entities(129) = New HTMLEntity("α","alpha") Entities(130) = New HTMLEntity("β","beta") Entities(131) = New HTMLEntity("γ","gamma") Entities(132) = New HTMLEntity("δ","delta") Entities(133) = New HTMLEntity("ε","epsilon") Entities(134) = New HTMLEntity("ζ","zeta") Entities(135) = New HTMLEntity("η","eta") Entities(136) = New HTMLEntity("θ","theta") Entities(137) = New HTMLEntity("ι","iota") Entities(138) = New HTMLEntity("κ","kappa") Entities(139) = New HTMLEntity("λ","lambda") Entities(140) = New HTMLEntity("μ","mu") Entities(141) = New HTMLEntity("ν","nu") Entities(142) = New HTMLEntity("ξ","xi") Entities(143) = New HTMLEntity("ο","omicron") Entities(144) = New HTMLEntity("π","pi") Entities(145) = New HTMLEntity("ρ","rho") Entities(146) = New HTMLEntity("ς","sigmaf") Entities(147) = New HTMLEntity("σ","sigma") Entities(148) = New HTMLEntity("τ","tau") Entities(149) = New HTMLEntity("υ","upsilon") Entities(150) = New HTMLEntity("φ","phi") Entities(151) = New HTMLEntity("χ","chi") Entities(152) = New HTMLEntity("ψ","psi") Entities(153) = New HTMLEntity("ω","omega") Entities(154) = New HTMLEntity("ϑ","thetasym") Entities(155) = New HTMLEntity("ϒ","upsih") Entities(156) = New HTMLEntity("ϖ","piv") Entities(157) = New HTMLEntity("•","bull") Entities(158) = New HTMLEntity("…","hellip") Entities(159) = New HTMLEntity("′","prime") Entities(160) = New HTMLEntity("″","Prime") Entities(161) = New HTMLEntity("‾","oline") Entities(162) = New HTMLEntity("⁄","frasl") Entities(163) = New HTMLEntity("℘","weierp") Entities(164) = New HTMLEntity("ℑ","image") Entities(165) = New HTMLEntity("ℜ","real") Entities(166) = New HTMLEntity("ℵ","alefsym") Entities(167) = New HTMLEntity("←","larr") Entities(168) = New HTMLEntity("↑","uarr") Entities(169) = New HTMLEntity("→","rarr") Entities(170) = New HTMLEntity("↓","darr") Entities(171) = New HTMLEntity("↔","harr") Entities(172) = New HTMLEntity("↵","crarr") Entities(173) = New HTMLEntity("⇐","lArr") Entities(174) = New HTMLEntity("⇑","uArr") Entities(175) = New HTMLEntity("⇒","rArr") Entities(176) = New HTMLEntity("⇓","dArr") Entities(177) = New HTMLEntity("⇔","hArr") Entities(178) = New HTMLEntity("∀","forall") Entities(179) = New HTMLEntity("∂","part") Entities(180) = New HTMLEntity("∃","exist") Entities(181) = New HTMLEntity("∅","empty") Entities(182) = New HTMLEntity("∇","nabla") Entities(183) = New HTMLEntity("∈","isin") Entities(184) = New HTMLEntity("∉","notin") Entities(185) = New HTMLEntity("∋","ni") Entities(186) = New HTMLEntity("∏","prod") Entities(187) = New HTMLEntity("∑","sum") Entities(188) = New HTMLEntity("−","minus") Entities(189) = New HTMLEntity("∗","lowast") Entities(190) = New HTMLEntity("√","radic") Entities(191) = New HTMLEntity("∝","prop") Entities(192) = New HTMLEntity("∞","infin") Entities(193) = New HTMLEntity("∠","ang") Entities(194) = New HTMLEntity("∧","and") Entities(195) = New HTMLEntity("∨","or") Entities(196) = New HTMLEntity("∩","cap") Entities(197) = New HTMLEntity("∪","cup") Entities(198) = New HTMLEntity("∫","int") Entities(199) = New HTMLEntity("∴","there4") Entities(200) = New HTMLEntity("∼","sim") Entities(201) = New HTMLEntity("≅","cong") Entities(202) = New HTMLEntity("≈","asymp") Entities(203) = New HTMLEntity("≠","ne") Entities(204) = New HTMLEntity("≡","equiv") Entities(205) = New HTMLEntity("≤","le") Entities(206) = New HTMLEntity("≥","ge") Entities(207) = New HTMLEntity("⊂","sub") Entities(208) = New HTMLEntity("⊃","sup") Entities(209) = New HTMLEntity("⊄","nsub") Entities(210) = New HTMLEntity("⊆","sube") Entities(211) = New HTMLEntity("⊇","supe") Entities(212) = New HTMLEntity("⊕","oplus") Entities(213) = New HTMLEntity("⊗","otimes") Entities(214) = New HTMLEntity("⊥","perp") Entities(215) = New HTMLEntity("⋅","sdot") Entities(216) = New HTMLEntity("⌈","lceil") Entities(217) = New HTMLEntity("⌉","rceil") Entities(218) = New HTMLEntity("⌊","lfloor") Entities(219) = New HTMLEntity("⌋","rfloor") Entities(220) = New HTMLEntity("◊","loz") Entities(221) = New HTMLEntity("♠","spades") Entities(222) = New HTMLEntity("♣","clubs") Entities(223) = New HTMLEntity("♥","hearts") Entities(224) = New HTMLEntity("♦","diams") Entities(225) = New HTMLEntity(" ","nbsp") Entities(226) = New HTMLEntity("—", "mdash") Entities(227) = New HTMLEntity("’", "rsquo" ) end End Sub #tag EndMethod #tag Method, Flags = &h0 Function UnescapeHTML(Extends Input As String) As String return UnescapeHTML(Input) End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function UnescapeHTML(Input As String) As String TestHTMLDictionary dim r as new regex dim m as regexmatch dim s as string = input dim c as string r.searchpattern = "&(\w+);" do m = r.search(s) if m <> nil then c = reversehtmlcharacter(m.subexpressionstring(1)) dim firstChunk as string = leftb(s,m.subexpressionstartb(0)) dim secondChunk as string = rightb(s,lenb(s) - (lenb(firstChunk) + lenb(m.subexpressionstring(0)))) s = firstChunk + c + secondChunk end loop until m = nil r.searchpattern = "&\#(\d{2,4});" do m = r.search(s) if m <> nil then c = encodings.utf8.chr(val(m.subexpressionstring(1))) dim firstChunk as string = leftb(s,m.subexpressionstartb(0)) dim secondChunk as string = rightb(s,lenb(s) - (lenb(firstChunk) + lenb(m.subexpressionstring(0)))) s = firstChunk + c + secondChunk end loop until m = nil return s End Function #tag EndMethod #tag Property, Flags = &h0 Entities(227) As HTMLEntity #tag EndProperty #tag ViewBehavior #tag ViewProperty Name="Index" Visible=true Group="ID" InitialValue="-2147483648" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag EndViewBehavior End Module #tag EndModule \ No newline at end of file diff --git a/ViMM/Modules/HTMLEntities/HTMLEntity.rbbas b/ViMM/Modules/HTMLEntities/HTMLEntity.rbbas new file mode 100644 index 0000000..fed95ea --- /dev/null +++ b/ViMM/Modules/HTMLEntities/HTMLEntity.rbbas @@ -0,0 +1 @@ +#tag Class Protected Class HTMLEntity #tag Method, Flags = &h0 Sub Constructor(EntityCharacter As String, EntitySymbol As String) me.character = entitycharacter me.symbol = entitysymbol End Sub #tag EndMethod #tag Property, Flags = &h0 Character As String #tag EndProperty #tag Property, Flags = &h0 Symbol As String #tag EndProperty #tag ViewBehavior #tag ViewProperty Name="Character" Group="Behavior" Type="String" EditorType="MultiLineEditor" #tag EndViewProperty #tag ViewProperty Name="Index" Visible=true Group="ID" InitialValue="-2147483648" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Symbol" Group="Behavior" Type="String" EditorType="MultiLineEditor" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag EndViewBehavior End Class #tag EndClass \ No newline at end of file diff --git a/ViMM/Modules/IMDb.rbbas b/ViMM/Modules/IMDb.rbbas old mode 100755 new mode 100644 index d755209..c7c3ed8 --- a/ViMM/Modules/IMDb.rbbas +++ b/ViMM/Modules/IMDb.rbbas @@ -1 +1 @@ -#tag Module Protected Module IMDb #tag Method, Flags = &h0 Function FindOnAnidDB(Name as String) As String Dim sckt as New HTTPSocket Dim HTML as String = Sckt.Get( "http://www.google.com/search?q=site:anidb.net+" + EncodingToURLMBS( Trim( Name ) ) + "&filter=0", 60 ) Dim ID as String = match( "anidb.net\/.*?aid=(.*?)<\/", HTML, 1 ) If Trim( ID ) <> "" Then Return ID Else MessageBox "No title found on google!" + chr(13) + chr(13) + Name Return "" End If End Function #tag EndMethod #tag Method, Flags = &h0 Function GetIMDbJSON(TitleID as String, Short as Boolean = False) As JSONItem If TitleID = "" Then Return Nil Dim Info as String = "GetIMDbJSON( " + TitleID +", " + Str( Short ) + " )" App.ErrorMessage = Info Dim Sckt as New HTTPSocket Sckt.Yield = True Dim IMDbJSON as New JSONItem Dim HTML as String Dim rand as New Random Dim IP as String = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) Sckt.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) Sckt.SetRequestHeader( "User-agent", "Mozilla/" + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,3) ) + " (Windows NT " + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,2) ) + "; rv:2.0.1) Gecko/20100101 Firefox/" + Str( rand.InRange(3,5) ) + ".0.1" ) If TitleID.Left(2) = "tt" Then HTML = Trim( DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + Trim( TitleID ) + "/", 60 ), Encodings.UTF8 ) ).ReplaceAll("\n", EndOfLine) Sckt.Close If HTML.InStr( 0, "The document has moved" ) > 0 Then Dim NewID as String = match( "The document has moved "" Then HTML = NewHTML End If 'If HTML.InStr( 0, "" ) = 0 Then If HTML.InStr( 0, "404 Error" ) > 0 and HTML.InStr(0, "When 404 Error Page Happens" ) = 0 Then If NOT nc.Available Then // Use growl fallback. If NOT Growl.Notify( "IMDb Search", kNoTitleFoundOnIMDb.ReplaceAll( "%ID", TitleID ) ) Then #If DebugBuild Then MessageBox "No title found on IMDb!" + chr(13) + chr(13) + TitleID End If Else nc.Message kNoTitleFoundOnIMDb.ReplaceAll( "%ID", TitleID ) End If If CommonCore.MassSearch Then CommonCore.UnfoundTitles.Append "IMDb Search" + chr(13) + kNoTitleFoundOnIMDb.ReplaceAll( "%ID", TitleID ) If ActiveSection = 0 Then CommonCore.UnfoundPaths.Append MovieAttr.FolderParent ElseIf ActiveSection = 1 Then CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If End If Return Nil End If Else HTML = Sckt.Get( "http://www.google.com/search?q=imdb+" + EncodingToURLMBS( Trim( TitleID ) ), 60 ) Dim ID as String = match( "http:\/\/www.imdb.com\/title\/(tt\d+).*?"".*?>.*?<\/a>", HTML, 1 ) If ID.Left(2) = "tt" Then Return GetIMDbJSON( ID ) Else If NOT nc.Available Then If NOT Growl.Notify( kNotFoundOnGoogle.ReplaceAll("%title", TitleID), "" ) And NOT CommonCore.MassSearch Then MessageBox kNotFoundOnGoogle + chr(13) + chr(13) + TitleID End If Else nc.Message kNotFoundOnGoogle.ReplaceAll("%title", TitleID) End If Return Nil End If End If IMDbJSON.Compact = False IMDbJSON.IndentSpacing = 2 Dim EmptyArray() as String Info = Info + " HTML: " + Str( Trim( HTML ) <> "" ) App.ErrorMessage = Info + " - Processing basics" IMDbJSON.Value("TITLE_ID") = Trim( match( "", HTML, 1 ).ReplaceAll("(original title)", "" ) ) IMDbJSON.Value("TITLE") = Trim( match( "(IMDb \- )*(.*?) \(.*?<\/title>", HTML, 2 ).ReplaceAll("<i>(original title)", "" ) ) IMDbJSON.Value("ORIGINAL_TITLE") = Trim( match( "class=""title-extra"".*?>(.*?)</", HTML, 1 ).ReplaceAll("<i>(original title)", "" ).ReplaceAll("""","") ) if IMDbJSON.Value("ORIGINAL_TITLE") = "" Then IMDbJSON.Value("ORIGINAL_TITLE") = IMDbJSON.Value("TITLE") IMDbJSON.Value("USA_TITLE") = "" IMDbJSON.Value("AKA") = Trim( match( "Also Known As.?:<\/h4>(.*?)(<span|<\/div)", HTML, 1 ) ) IMDbJSON.Value("ALSO_KNOWN_AS") = ValueArray( EmptyArray ) IMDbJSON.Value("YEAR") = Trim( match( "<title>.*?\(.*?(\d{4}).*?\).*?<\/title>", HTML, 1 ) ) IMDbJSON.Value("RELEASE_DATE") = match( "Release Date:<\/h4>.*?([0-9][0-9]? (January|February|March|April|May|June|July|August|September|October|November|December) (19|20)[0-9][0-9]).*?(\(|<span)", HTML, 1 ) IMDbJSON.Value("RELEASE_DATES") = ValueArray( EmptyArray ) HTML = HTML.ReplaceAll( HTML.MyMid("<head>", "</head>"), "" ).ReplaceAll("<head></head>", "") IMDbJSON.Value("RUNTIME") = match( "Runtime:<\/h4>.*?(\d+) min.*?<\/div>", HTML, 1 ) If IMDbJSON.Value("RUNTIME") = "" Then IMDbJSON.Value("RUNTIME") = Trim( match( "infobar.*?(\d+) min.*?<\/div>", HTML, 1 ) ) IMDbJSON.Value("TOP_250") = match( "Top 250 #(\d+)<", HTML, 1 ) IMDbJSON.Value("RATING") = Trim( match("ratingValue"">(\d.\d)<", HTML, 1 ) ) IMDbJSON.Value("VOTES") = match("ratingCount"">(\d+,?\d*)<\/span>", HTML, 1 ) IMDbJSON.Value("MPAA_RATING") = Trim( match( "<span itemprop=""contentRating"">(.*?)(<\/span>|<a)", HTML, 1 ) ) IMDbJSON.Value("CERTIFICATIONS") = ValueArray( EmptyArray ) IMDbJSON.Value("OSCARS") = match( "Won (\d+) Oscar(s|).", HTML, 1 ) IMDbJSON.Value("AWARDS") = match("(\d+) wins", HTML, 1 ) IMDbJSON.Value("NOMINATIONS") = match("(\d+) nominations", HTML, 1 ) IMDbJSON.Value("GENRES") = ValueArray( match_all( "<a.*?>(.*?)<\/a>", match( "Genre.?:(.*?)(<\/div>|See more)", HTML, 1 ) ) ) IMDbJSON.Value("TAGLINE") = match( "Tagline.?:<\/h4>(.*?)(<span|<\/div)", HTML, 1 ) IMDbJSON.Value("TAGLINES") = ValueArray( EmptyArray ) Dim Source as String = HTML.MyMid( "id=""title-overview-widget-layout"">", "</table>" ) IMDbJSON.Value("PLOT") = Trim( RemoveTags( match( "class=""summary_text"" itemprop=""description"">(.*?)(<\/div>|<a)", Source, 1 ) ) ) 'IMDbJSON.Value("PLOT") = Trim( RemoveTags( match( "id=""overview-top"">.*?<p itemprop=""description"">(.*?)(<\/p>|<a|<\/td)", HTML, 1 ) ) ) IMDbJSON.Value("STORYLINE") = Trim( RemoveTags( match("Storyline<\/h2>(.*?)(<em|<\/p>|<span)", HTML, 1 ).ReplaceAll( "<p>", "" ) ).ReplaceAll("<div class=""inline canwrap"" itemprop=""description"">", "") ) IMDbJSON.Value("STORYLINES") = ValueArray( EmptyArray ) IMDbJSON.Value("DIRECTORS") = ValueArray( match_all( "<a.*?><span.*?>(.*?)<\/span><\/a>", match( "Director.?:(.*?)(<\/div>|>.?and )", HTML, 1 ) ) ) IMDbJSON.Value("WRITERS") = ValueArray( match_all( "<a.*?><span.*?>(.*?)<\/span><\/a>", match( "Writer.?:(.*?)(<\/div>|>.?and )", HTML, 1 ) ) ) IMDbJSON.Value("STARS") = ValueArray( match_all( "<a.*?><span.*?>(.*?)<\/span><\/a>", match( "Stars:(.*?)(<\/div>|See full cast and crew|<span>\|)", HTML, 1 ) ) ) IMDbJSON.Value("CAST") = ValueArray( MatchArray( match_all( "<td.*?itemprop=""actor"".*?>(.*?)<\/td>", HTML ), "<a.*?>.*?<span.*?>(.*?)<\/span>" ) ) 'ValueArray( MatchArray( match_all( "<td class=""name"">(.*?)<\/td>", HTML ), "<a.*?>(.*?)<\/a>" ) ) IMDbJSON.Value("ROLES") = ValueArray( match_all( "<td class=""character"">(.*?)<\/td>", HTML ) ) 'ValueArray( MatchArray( match_all( "<td class=""character"">(.*?)<\/td>", HTML ), "<a.*?>(.*?)<\/a>" ) ) For i as Integer = 0 to IMDbJSON.Child("ROLES").Count -1 If IMDbJSON.Child("ROLES").Value(i).Instr( 0, "<a" ) > 0 Then IMDbJSON.Child("ROLES").Value(i) = match( "<a.*?>(.*?)<\/a>", IMDbJSON.Child("ROLES").Value(i), 1 ) End If If IMDbJSON.Child("ROLES").Value(i).InStr( 0, "<div" ) > 0 Then 'IMDbJSON.Child("ROLES").Value(i) = Trim( match( "<div>(.*?)<\/", IMDbJSON.Child("ROLES").Value(i) ) ) Dim s as String = IMDbJSON.Child("ROLES").Value(i) s = s.ReplaceAll( "<div>", "" ) s = s.ReplaceAll( "</div>", "" ) s = s.ReplaceAll( "\n", "" ) s = Trim( s ) IMDbJSON.Child("ROLES").Value(i) = s 'Trim( IMDbJSON.Child("ROLES").Value(i).ReplaceAll("<div>", "").ReplaceAll("<\/div>", "").ReplaceAll("\n", "") ) End If IMDbJSON.Child("ROLES").Value(i) = ReplaceAll( IMDbJSON.Child("ROLES").Value(i), " ", "" ) IMDbJSON.Child("ROLES").Value(i) = ReplaceAll( IMDbJSON.Child("ROLES").Value(i), "...", "" ) IMDbJSON.Child("ROLES").Value(i) = trim( IMDbJSON.Child("ROLES").Value(i) ) if IMDbJSON.Child("ROLES").Value(i).right(1) = "/" then IMDbJSON.Child("ROLES").Value(i) = Trim( IMDbJSON.Child("ROLES").Value(i).left( IMDbJSON.Child("ROLES").Value(i).len -1 ) ) end if 'IMDbJSON.Child("ROLES").Value(i) = IMDbJSON.Child("ROLES").Value(i).left( IMDbJSON.Child("ROLES").Value(i).instr( "\n" ) + 1 ) IMDbJSON.Child("ROLES").Value(i) = Trim( RegExThis( IMDbJSON.Child("ROLES").Value(i), "\(.*\)" ) ) Next IMDbJSON.Value("CASTTHUMBS") = ValueArray( MatchArray( match_all( "<td class=""primary_photo"">(.*?)<\/td>", HTML ), "<img.*loadlate=""(.*?)"".*\/>" ) ) App.ErrorMessage = Info + " - " + "CastThumbs" For i as Integer = 0 to IMDbJSON.Child("CASTTHUMBS").Count -1 IMDbJSON.Child("CASTTHUMBS").Value(i) = RegExThis( IMDbJSON.Child("CASTTHUMBS").Value(i), "_V1.*?.jpg", "_V1_SY750.jpg" ) Next IMDbJSON.Value("LANGUAGE") = ValueArray( match_all( "<a.*?>(.*?)<\/a>", match( "Language.?:(.*?)(<\/div>|>.?and )", HTML, 1 ) ) ) IMDbJSON.Value("COUNTRY") = ValueArray( match_all( "<a.*?>(.*?)<\/a>", match( "Country:(.*?)(<\/div>|>.?and )", HTML, 1 ) ) ) IMDbJSON.Value("STUDIOS") = ValueArray( match_all( "<a.*?><span.*?>(.*?)<\/span><\/a>", match( "Production Co:(.*?)(<\/div>|See more)", HTML, 1 ) ) ) IMDbJSON.Value("RECOMMENDATIONS") = ValueArray( EmptyArray ) IMDbJSON.Value("POSTER") = match("img_primary"">.*?<img.*?src=""(.*?)"".*?<\/td>", Source, 1 ) IMDbJSON.Value("POSTER_LARGE") = "" IMDbJSON.Value("POSTER_SMALL") = "" IMDbJSON.Value("POSTER_FULL") = "" If IMDbJSON.Value("POSTER") <> "" Then IMDbJSON.Value("POSTER_LARGE") = RegExThis( IMDbJSON.Value("POSTER"), "_V1_.*?.jpg", "_V1_SY500.jpg" ) IMDbJSON.Value("POSTER_SMALL") = RegExThis( IMDbJSON.Value("POSTER"), "_V1_.*?.jpg", "_V1_SY150.jpg" ) IMDbJSON.Value("POSTER_FULL") = RegExThis( IMDbJSON.Value("POSTER"), "_V1_.*?.jpg", "_V1_SY0.jpg" ) End If IMDbJSON.Value("MEDIA_IMAGES") = ValueArray( EmptyArray ) If NOT Short Then // Also Known as & Release INFO Dim ReleaseInfoHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/releaseinfo", 60 ), Encodings.UTF8 ) Sckt.Close Dim AKATableRows() as String = match_all( "<tr(.*?)<\/tr>", match( "<h4 class=\""li_group\"">Also Known As(.*?)<\/table>", ReleaseInfoHTML, 1 ) ) Dim AKAS() as String Dim USATitle as String App.ErrorMessage = Info + " - " + "AKA/USA Titles" For i as Integer = 0 to AKATableRows.Ubound Dim NameCountry() as String = match_all( "<td>(.*?)<\/td", AKATableRows(i) ) If NameCountry.Ubound >= 1 then' And NameCountry(1).InStr( 0, "USA" ) > 0 Then if NameCountry(0).Contains("USA") then USATitle = NameCountry(1) AKAS.Append NameCountry(0) + " = " + NameCountry(1) End If Next IMDbJSON.Value("ALSO_KNOWN_AS") = ValueArray( AKAS ) IMDbJSON.Value("USA_TITLE") = USATitle Dim DateTableRows() as String = match_all( "<tr(.*?)<\/tr>", match( "<h4 class=\""li_group\"">Release Dates(.*?)<\/table>", ReleaseInfoHTML ) ) Dim Dates() as String App.ErrorMessage = Info + " - " + "All country titles" For i as Integer = 0 to DateTableRows.Ubound Dim Country as String = match( "<td><a .*? >(.*?)<\/a><\/td>", DateTableRows(i), 1 ) Dim Date as String = match( "<td class=\""release_date\"">(.*?)</td>", DateTableRows(i), 1 ) date = Trim( RegExThis( Date, " <a href=\"".*?\"" >", ", " ).ReplaceAll("</a>","") ) Dates.Append Date + " = " + Country Next IMDbJSON.Value("RELEASE_DATES") = ValueArray( Dates ) // Storylines App.ErrorMessage = Info + " - " + "Storylines" Dim StoryLinesHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/plotsummary", 60 ), Encodings.UTF8 ) Sckt.Close IMDbJSON.Value("STORYLINES") = ValueArray( match_all( "<p class=""plotpar"">(.*?)(<i>|<a|<\/p)", StoryLinesHTML ) ) If IMDbJSON.Child("STORYLINES").Count >= 1 Then IMDbJSON.Value("STORYLINE") = IMDbJSON.Child("STORYLINES").Value(0) // Taglines App.ErrorMessage = Info + " - " + "Taglines" Dim TagLinesHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/taglines", 60 ), Encodings.UTF8 ) Sckt.Close IMDbJSON.Value("TAGLINES") = ValueArray( match_all( "<div class=\""soda .*?\"">(.*?)<\/div>", TagLinesHTML ) ) If IMDbJSON.Child("TAGLINES").Count >= 1 Then 'IMDbJSON.Child("TAGLINES").Remove(0) For i as Integer = 0 to IMDbJSON.Child("TAGLINES").Count -1 if IMDbJSON.Child("TAGLINES").Value(i) = IMDbJSON.Value("TAGLINE") then IMDbJSON.Child("TAGLINES").Remove(i) Continue end if if Str( IMDbJSON.Child("TAGLINES").Value(i) ).Contains("It looks like we don't have any Taglines for this title yet") then IMDbJSON.Child("TAGLINES").Remove(i) Continue end if Next End If // Recommended Titles App.ErrorMessage = Info + " - " + "Recommended Titles" Dim JSONString as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/widget/recommendations/_ajax/get_more_recs?specs=p13nsims%3A" + TitleID, 60 ), Encodings.UTF8 ) Sckt.Close App.ErrorMessage = Info + " - " + "Decoding from HTML" JSONString = Trim( JSONString ) Dim Recommendations as New JSONItem App.ErrorMessage = Info + " - " + "Loading recommendations" If JSONString <> "" And JSONString.Left(1) = "{" OR JSONString.Left(1) = "[" Then Recommendations.Load Trim( JSONString ) App.ErrorMessage = Info + " - " + "Setting recomendations child" If Recommendations <> Nil And Recommendations.HasName("recommendations") Then Recommendations = Recommendations.Child("recommendations") Dim RecIDs(), RecTitles(), Recs() as String App.ErrorMessage = Info + " - " + "Recommendations" For i as Integer = 0 to Recommendations.Count -1 RecIDs.Append Recommendations.Child(i).Value("tconst") RecTitles.Append match( "title=""(.*?)""", Recommendations.Child(i).Value("content"), 1 ) Next For i as Integer = 0 to RecTitles.Ubound If RecIDs.Ubound >= i Then Recs.Append RecTitles(i) + " [" + RecIDs(i) + "]" Else Recs.Append RecTitles(i) Next If Recs.Ubound > -1 Then IMDbJSON.Value("RECOMMENDATIONS") = ValueArray( Recs ) // Media Images Dim MediaImagesHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/mediaindex", 60 ), Encodings.UTF8 ) Sckt.Close Dim links as String = match( "<div class=""thumb_list"" style=""font-size: 0px;"">(.*?)<\/div>", MediaImagesHTML, 1 ) Dim images() as String = match_all( "src=""(.*?)""", links ) IMDbJSON.Value("MEDIA_IMAGES") = ValueArray( images ) App.ErrorMessage = Info + " - " + "Media Images" For i as Integer = 0 to IMDbJSON.Child("MEDIA_IMAGES").Count -1 IMDbJSON.Child("MEDIA_IMAGES").Value(i) = RegExThis( IMDbJSON.Child("MEDIA_IMAGES").Value(i), "_V1\..*?.jpg", "_V1._SY0.jpg" ) Next // Certification Dim CertificationHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/parentalguide", 60 ), Encodings.UTF8 ) IMDbJSON.Value("CERTIFICATIONS") = ValueArray( match_all( "<a.*?>(.*?)<\/a>", match( "<div class=""info-content"">(.*?)<\/div>", CertificationHTML, 1 ) ) ) // Full Cast If Prefs.boolForKey("IMDbFullCast") Then Dim FullCastHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/fullcredits", 60 ), Encodings.utf8 ) Sckt.Close 'IMDbJSON.Value("CAST") = ValueArray( MatchArray( match_all( "<td class=""nm"">(.*?)<\/td>", FullCastHTML ), "<a.*?>(.*?)<\/a>" ) ) 'IMDbJSON.Value("ROLES") = ValueArray( match_all( "<td class=""char"">(.*?)<\/td>", FullCastHTML ) )'<a.*?>(.*?)<\/a>" ) ) 'IMDbJSON.Value("CASTTHUMBS") = ValueArray( MatchArray( match_all( "<td class=""hs"">(.*?)<\/td>", FullCastHTML ), "<img.*src=""(.*?)"".*><\/a" ) ) IMDbJSON.Value("CAST") = ValueArray( match_all( "<span class=""itemprop"" itemprop=""name"".*?>(.*?)<\/span>", FullCastHTML ) ) IMDbJSON.Value("ROLES") = ValueArray( match_all( "<td class=""character"">(.*?)<\/td>", FullCastHTML ) ) IMDbJSON.Value("CASTTHUMBS") = ValueArray( MatchArray( match_all( "<td class=""primary_photo"">(.*?)<\/td>", FullCastHTML ), "<img.*?loadlate=""(.*?)"".*><\/a" ) ) App.ErrorMessage = Info + " - " + "Actor ROLES" For i as Integer = 0 to IMDbJSON.Child("ROLES").Count -1 If IMDbJSON.Child("ROLES").Value(i).Instr( 0, "<a" ) > 0 Then IMDbJSON.Child("ROLES").Value(i) = match( "<a.*?>(.*?)<\/a>", IMDbJSON.Child("ROLES").Value(i), 1 ) End If if IMDbJSON.Child("ROLES").Value(i).Contains( "<div>" ) then IMDbJSON.Child("ROLES").Value(i) = Trim( match( "<div>(.*?)<\/div>", IMDbJSON.Child("ROLES").Value(i), 1 ) ) end if IMDbJSON.Child("ROLES").Value(i) = ReplaceAll( IMDbJSON.Child("ROLES").Value(i), " ", "" ) IMDbJSON.Child("ROLES").Value(i) = ReplaceAll( IMDbJSON.Child("ROLES").Value(i), "...", "" ) IMDbJSON.Child("ROLES").Value(i) = trim( IMDbJSON.Child("ROLES").Value(i) ) if IMDbJSON.Child("ROLES").Value(i).right(1) = "/" then IMDbJSON.Child("ROLES").Value(i) = Trim( IMDbJSON.Child("ROLES").Value(i).left( IMDbJSON.Child("ROLES").Value(i).len -1 ) ) end if IMDbJSON.Child("ROLES").Value(i) = Trim( RegExThis( IMDbJSON.Child("ROLES").Value(i), "\(.*\)" ) ) Next App.ErrorMessage = Info + " - " + "Cast Thumbs" For i as Integer = 0 to IMDbJSON.Child("CASTTHUMBS").Count -1 IMDbJSON.Child("CASTTHUMBS").Value(i) = RegExThis( IMDbJSON.Child("CASTTHUMBS").Value(i), "_V1.*?.jpg", "_V1_SY512.jpg" ) Next dim s as string End If End If App.ErrorMessage = "" Return IMDbJSON Exception err as OutOfBoundsException Dim w as New wndBugReporter w.Init( err, "GetIMDBJSON( " + TitleID + ", " + Str( Short ) + " )" + chr(13) + App.ErrorMessage ) App.ErrorMessage = "" Return Nil End Function #tag EndMethod #tag Method, Flags = &h21 Private Function MatchArray(Arry() as String, SrchPattern as String, i as Integer = 1) As String() Dim Arr() as String For each value as Variant in Arry Arr.Append Trim( match( SrchPattern, value, i ) ) Next Return Arr End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function RemoveTags(Text as String) As String 'Dim s as string = RegExThis( Text, "<\/span> »", "" ) // Don't be too agressive with links Text = RegExThis( Text, "<a.*?>", "" ) Text = ReplaceAll( Text, "</a>", "" ) Return RegExThis( Text, "<.*?<\/.*?>", "" ) End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function ValueArray(Values() as String) As JSONItem If Values <> Nil Then Dim Daddy as New JSONItem For i as Integer = 0 to Values.Ubound Daddy.Value(i) = Values(i) Next Return Daddy End If End Function #tag EndMethod #tag Constant, Name = kNotFoundOnGoogle, Type = String, Dynamic = True, Default = \"IMDb Search didn\'t find %title on google!", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"IMDb Search didn\'t find %title on Google!" #Tag Instance, Platform = Any, Language = nl, Definition = \"IMDb heeft %titel niet gevonden via Google!" #Tag Instance, Platform = Any, Language = fr, Definition = \"La recherche IMDB n\'a pas trouv\xC3\xA9 %title sur google !" #Tag Instance, Platform = Any, Language = de, Definition = \"Die IMDb-Suche kann %title bei Google nicht finden!" #tag EndConstant #tag Constant, Name = kNoTitleFoundOnIMDb, Type = String, Dynamic = True, Default = \"No title found on IMDb! %ID", Scope = Public #Tag Instance, Platform = Any, Language = en, Definition = \"No title found on IMDb! %ID" #Tag Instance, Platform = Any, Language = nl, Definition = \"Geen title gevonden op IMDb! %ID" #Tag Instance, Platform = Any, Language = de, Definition = \"Kein Titel IMDb gefunden! %ID" #Tag Instance, Platform = Any, Language = fr, Definition = \"Aucun titre trouv\xC3\xA9 sur IMDb! %ID" #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Index" Visible=true Group="ID" InitialValue="-2147483648" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag EndViewBehavior End Module #tag EndModule \ No newline at end of file +#tag Module Protected Module IMDb #tag Method, Flags = &h0 Function FindOnAnidDB(Name as String) As String Dim sckt as New HTTPSocket Dim HTML as String = Sckt.Get( "http://www.google.com/search?q=site:anidb.net+" + EncodingToURLMBS( Trim( Name ) ) + "&filter=0", 60 ) Dim ID as String = match( "anidb.net\/.*?aid=(.*?)<\/", HTML, 1 ) If Trim( ID ) <> "" Then Return ID Else MessageBox "No title found on google!" + chr(13) + chr(13) + Name Return "" End If End Function #tag EndMethod #tag Method, Flags = &h0 Function GetIMDbJSON(TitleID as String, Short as Boolean = False) As JSONItem If TitleID = "" Then Return Nil Dim Info as String = "GetIMDbJSON( " + TitleID +", " + Str( Short ) + " )" App.ErrorMessage = Info Dim Sckt as New HTTPSocket Sckt.Yield = True Dim IMDbJSON as New JSONItem Dim HTML as String Dim rand as New Random Dim IP as String = Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) + "." + Str( rand.InRange(0,255) ) Sckt.SetRequestHeader( "httpheader", "REMOTE_ADDR: " + IP ) Sckt.SetRequestHeader( "User-agent", "Mozilla/" + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,3) ) + " (Windows NT " + Str( rand.InRange(3,5) ) + "." + Str( rand.InRange(0,2) ) + "; rv:2.0.1) Gecko/20100101 Firefox/" + Str( rand.InRange(3,5) ) + ".0.1" ) If TitleID.Left(2) = "tt" Then HTML = Trim( DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + Trim( TitleID ) + "/", 60 ), Encodings.UTF8 ) ).ReplaceAll("\n", EndOfLine) Sckt.Close If HTML.InStr( 0, "The document has moved" ) > 0 Then Dim NewID as String = match( "The document has moved <A HREF=""(.*?)""", HTML, 1 ) Dim NewHTML as String = Trim( DefineEncoding( Sckt.Get( NewID, 60 ), Encodings.UTF8 ) ).ReplaceAll("\n", EndOfLine) If NewHTML <> "" Then HTML = NewHTML End If 'If HTML.InStr( 0, "<meta name=""application-name"" content=""IMDb"" />" ) = 0 Then If HTML.InStr( 0, "404 Error" ) > 0 and HTML.InStr(0, "When 404 Error Page Happens" ) = 0 Then If NOT nc.Available Then // Use growl fallback. If NOT Growl.Notify( "IMDb Search", kNoTitleFoundOnIMDb.ReplaceAll( "%ID", TitleID ) ) Then #If DebugBuild Then MessageBox "No title found on IMDb!" + chr(13) + chr(13) + TitleID End If Else nc.Message kNoTitleFoundOnIMDb.ReplaceAll( "%ID", TitleID ) End If If CommonCore.MassSearch Then CommonCore.UnfoundTitles.Append "IMDb Search" + chr(13) + kNoTitleFoundOnIMDb.ReplaceAll( "%ID", TitleID ) If ActiveSection = 0 Then CommonCore.UnfoundPaths.Append MovieAttr.FolderParent ElseIf ActiveSection = 1 Then CommonCore.UnfoundPaths.Append TVAttr.FolderParent End If End If Return Nil End If Else HTML = Sckt.Get( "http://www.google.com/search?q=imdb+" + EncodingToURLMBS( Trim( TitleID ) ), 60 ) Dim ID as String = match( "http:\/\/www.imdb.com\/title\/(tt\d+).*?"".*?>.*?<\/a>", HTML, 1 ) If ID.Left(2) = "tt" Then Return GetIMDbJSON( ID ) Else If NOT nc.Available Then If NOT Growl.Notify( kNotFoundOnGoogle.ReplaceAll("%title", TitleID), "" ) And NOT CommonCore.MassSearch Then MessageBox kNotFoundOnGoogle + chr(13) + chr(13) + TitleID End If Else nc.Message kNotFoundOnGoogle.ReplaceAll("%title", TitleID) End If Return Nil End If End If IMDbJSON.Compact = False IMDbJSON.IndentSpacing = 2 Dim EmptyArray() as String Info = Info + " HTML: " + Str( Trim( HTML ) <> "" ) App.ErrorMessage = Info + " - Processing basics" IMDbJSON.Value("TITLE_ID") = Trim( match( "<link rel=""canonical"" href=""http:\/\/www.imdb.com\/title\/(tt\d+)\/"" \/>", HTML, 1 ).ReplaceAll("<i>(original title)", "" ) ) IMDbJSON.Value("TITLE") = Trim( match( "<title>(IMDb \- )*(.*?) \(.*?<\/title>", HTML, 2 ).ReplaceAll("<i>(original title)", "" ) ) IMDbJSON.Value("ORIGINAL_TITLE") = Trim( match( "class=""title-extra"".*?>(.*?)</", HTML, 1 ).ReplaceAll("<i>(original title)", "" ).ReplaceAll("""","") ) if IMDbJSON.Value("ORIGINAL_TITLE") = "" Then IMDbJSON.Value("ORIGINAL_TITLE") = IMDbJSON.Value("TITLE") IMDbJSON.Value("USA_TITLE") = "" IMDbJSON.Value("AKA") = Trim( match( "Also Known As.?:<\/h4>(.*?)(<span|<\/div)", HTML, 1 ) ) IMDbJSON.Value("ALSO_KNOWN_AS") = ValueArray( EmptyArray ) IMDbJSON.Value("YEAR") = Trim( match( "<title>.*?\(.*?(\d{4}).*?\).*?<\/title>", HTML, 1 ) ) IMDbJSON.Value("RELEASE_DATE") = match( "Release Date:<\/h4>.*?([0-9][0-9]? (January|February|March|April|May|June|July|August|September|October|November|December) (19|20)[0-9][0-9]).*?(\(|<span)", HTML, 1 ) IMDbJSON.Value("RELEASE_DATES") = ValueArray( EmptyArray ) HTML = HTML.ReplaceAll( HTML.MyMid("<head>", "</head>"), "" ).ReplaceAll("<head></head>", "") IMDbJSON.Value("RUNTIME") = match( "Runtime:<\/h4>.*?(\d+) min.*?<\/div>", HTML, 1 ) If IMDbJSON.Value("RUNTIME") = "" Then IMDbJSON.Value("RUNTIME") = Trim( match( "infobar.*?(\d+) min.*?<\/div>", HTML, 1 ) ) IMDbJSON.Value("TOP_250") = match( "Top 250 #(\d+)<", HTML, 1 ) IMDbJSON.Value("RATING") = Trim( match("ratingValue"">(\d.\d)<", HTML, 1 ) ) IMDbJSON.Value("VOTES") = match("ratingCount"">(\d+,?\d*)<\/span>", HTML, 1 ) IMDbJSON.Value("MPAA_RATING") = Trim( match( "<span itemprop=""contentRating"">(.*?)(<\/span>|<a)", HTML, 1 ) ) IMDbJSON.Value("CERTIFICATIONS") = ValueArray( EmptyArray ) IMDbJSON.Value("OSCARS") = match( "Won (\d+) Oscar(s|).", HTML, 1 ) IMDbJSON.Value("AWARDS") = match("(\d+) wins", HTML, 1 ) IMDbJSON.Value("NOMINATIONS") = match("(\d+) nominations", HTML, 1 ) IMDbJSON.Value("GENRES") = ValueArray( match_all( "<a.*?>(.*?)<\/a>", match( "Genre.?:(.*?)(<\/div>|See more)", HTML, 1 ) ) ) IMDbJSON.Value("TAGLINE") = match( "Tagline.?:<\/h4>(.*?)(<span|<\/div)", HTML, 1 ) IMDbJSON.Value("TAGLINES") = ValueArray( EmptyArray ) Dim Source as String = HTML.MyMid( "id=""title-overview-widget-layout"">", "</table>" ) IMDbJSON.Value("PLOT") = Trim( RemoveTags( match( "class=""summary_text"" itemprop=""description"">(.*?)(<\/div>|<a)", Source, 1 ) ) ) 'IMDbJSON.Value("PLOT") = Trim( RemoveTags( match( "id=""overview-top"">.*?<p itemprop=""description"">(.*?)(<\/p>|<a|<\/td)", HTML, 1 ) ) ) IMDbJSON.Value("STORYLINE") = Trim( RemoveTags( match("Storyline<\/h2>(.*?)(<em|<\/p>|<span)", HTML, 1 ).ReplaceAll( "<p>", "" ) ).ReplaceAll("<div class=""inline canwrap"" itemprop=""description"">", "") ) IMDbJSON.Value("STORYLINES") = ValueArray( EmptyArray ) IMDbJSON.Value("DIRECTORS") = ValueArray( match_all( "<a.*?><span.*?>(.*?)<\/span><\/a>", match( "Director.?:(.*?)(<\/div>|>.?and )", HTML, 1 ) ) ) IMDbJSON.Value("WRITERS") = ValueArray( match_all( "<a.*?><span.*?>(.*?)<\/span><\/a>", match( "Writer.?:(.*?)(<\/div>|>.?and )", HTML, 1 ) ) ) IMDbJSON.Value("STARS") = ValueArray( match_all( "<a.*?><span.*?>(.*?)<\/span><\/a>", match( "Stars:(.*?)(<\/div>|See full cast and crew|<span>\|)", HTML, 1 ) ) ) IMDbJSON.Value("CAST") = ValueArray( MatchArray( match_all( "<td.*?itemprop=""actor"".*?>(.*?)<\/td>", HTML ), "<a.*?>.*?<span.*?>(.*?)<\/span>" ) ) 'ValueArray( MatchArray( match_all( "<td class=""name"">(.*?)<\/td>", HTML ), "<a.*?>(.*?)<\/a>" ) ) IMDbJSON.Value("ROLES") = ValueArray( match_all( "<td class=""character"">(.*?)<\/td>", HTML ) ) 'ValueArray( MatchArray( match_all( "<td class=""character"">(.*?)<\/td>", HTML ), "<a.*?>(.*?)<\/a>" ) ) For i as Integer = 0 to IMDbJSON.Child("ROLES").Count -1 If IMDbJSON.Child("ROLES").Value(i).Instr( 0, "<a" ) > 0 Then IMDbJSON.Child("ROLES").Value(i) = match( "<a.*?>(.*?)<\/a>", IMDbJSON.Child("ROLES").Value(i), 1 ) End If If IMDbJSON.Child("ROLES").Value(i).InStr( 0, "<div" ) > 0 Then 'IMDbJSON.Child("ROLES").Value(i) = Trim( match( "<div>(.*?)<\/", IMDbJSON.Child("ROLES").Value(i) ) ) Dim s as String = IMDbJSON.Child("ROLES").Value(i) s = s.ReplaceAll( "<div>", "" ) s = s.ReplaceAll( "</div>", "" ) s = s.ReplaceAll( "\n", "" ) s = Trim( s ) IMDbJSON.Child("ROLES").Value(i) = s 'Trim( IMDbJSON.Child("ROLES").Value(i).ReplaceAll("<div>", "").ReplaceAll("<\/div>", "").ReplaceAll("\n", "") ) End If IMDbJSON.Child("ROLES").Value(i) = ReplaceAll( IMDbJSON.Child("ROLES").Value(i), " ", "" ) IMDbJSON.Child("ROLES").Value(i) = ReplaceAll( IMDbJSON.Child("ROLES").Value(i), "...", "" ) IMDbJSON.Child("ROLES").Value(i) = trim( IMDbJSON.Child("ROLES").Value(i) ) if IMDbJSON.Child("ROLES").Value(i).right(1) = "/" then IMDbJSON.Child("ROLES").Value(i) = Trim( IMDbJSON.Child("ROLES").Value(i).left( IMDbJSON.Child("ROLES").Value(i).len -1 ) ) end if 'IMDbJSON.Child("ROLES").Value(i) = IMDbJSON.Child("ROLES").Value(i).left( IMDbJSON.Child("ROLES").Value(i).instr( "\n" ) + 1 ) IMDbJSON.Child("ROLES").Value(i) = Trim( RegExThis( IMDbJSON.Child("ROLES").Value(i), "\(.*\)" ) ) Next IMDbJSON.Value("CASTTHUMBS") = ValueArray( MatchArray( match_all( "<td class=""primary_photo"">(.*?)<\/td>", HTML ), "<img.*loadlate=""(.*?)"".*\/>" ) ) App.ErrorMessage = Info + " - " + "CastThumbs" For i as Integer = 0 to IMDbJSON.Child("CASTTHUMBS").Count -1 IMDbJSON.Child("CASTTHUMBS").Value(i) = RegExThis( IMDbJSON.Child("CASTTHUMBS").Value(i), "_V1.*?.jpg", "_V1_SY750.jpg" ) Next IMDbJSON.Value("LANGUAGE") = ValueArray( match_all( "<a.*?>(.*?)<\/a>", match( "Language.?:(.*?)(<\/div>|>.?and )", HTML, 1 ) ) ) IMDbJSON.Value("COUNTRY") = ValueArray( match_all( "<a.*?>(.*?)<\/a>", match( "Country:(.*?)(<\/div>|>.?and )", HTML, 1 ) ) ) IMDbJSON.Value("STUDIOS") = ValueArray( match_all( "<a.*?><span.*?>(.*?)<\/span><\/a>", match( "Production Co:(.*?)(<\/div>|See more)", HTML, 1 ) ) ) IMDbJSON.Value("RECOMMENDATIONS") = ValueArray( EmptyArray ) IMDbJSON.Value("POSTER") = match("<div class=""poster"">.*?src=""(.*?)""", Source, 1 ) 'match("img_primary"">.*?<img.*?src=""(.*?)"".*?<\/td>", Source, 1 ) IMDbJSON.Value("POSTER_LARGE") = "" IMDbJSON.Value("POSTER_SMALL") = "" IMDbJSON.Value("POSTER_FULL") = "" If IMDbJSON.Value("POSTER").StringValue <> "" Then IMDbJSON.Value("POSTER_LARGE") = IMDbJSON.Value("POSTER").StringValue.ReplaceAll("_V1_UX182_CR0,0,182,268_AL_.jpg", "_V1_SY500.jpg") 'RegExThis( IMDbJSON.Value("POSTER"), "_V1_.*?.jpg", "_V1_SY500.jpg" ) IMDbJSON.Value("POSTER_SMALL") = IMDbJSON.Value("POSTER").StringValue.ReplaceAll("_V1_UX182_CR0,0,182,268_AL_.jpg", "_V1_SY150.jpg") 'RegExThis( IMDbJSON.Value("POSTER"), "_V1_.*?.jpg", "_V1_SY150.jpg" ) IMDbJSON.Value("POSTER_FULL") = IMDbJSON.Value("POSTER").StringValue.ReplaceAll("_V1_UX182_CR0,0,182,268_AL_.jpg", "_V1_SY0.jpg") 'RegExThis( IMDbJSON.Value("POSTER"), "_V1_.*?.jpg", "_V1_SY0.jpg" ) End If IMDbJSON.Value("MEDIA_IMAGES") = ValueArray( EmptyArray ) If NOT Short Then // Also Known as & Release INFO Dim ReleaseInfoHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/releaseinfo", 60 ), Encodings.UTF8 ) Sckt.Close Dim AKATableRows() as String = match_all( "<tr(.*?)<\/tr>", match( "id=""akas""(.*?)<\/table>", ReleaseInfoHTML, 1 ) ) Dim AKAS() as String Dim USATitle as String App.ErrorMessage = Info + " - " + "AKA/USA Titles" For i as Integer = 0 to AKATableRows.Ubound Dim NameCountry() as String = match_all( "<td>(.*?)<\/td", AKATableRows(i) ) If NameCountry.Ubound >= 1 then' And NameCountry(1).InStr( 0, "USA" ) > 0 Then if NameCountry(0).Contains("USA") then USATitle = NameCountry(1) AKAS.Append NameCountry(0) + " = " + NameCountry(1) End If Next IMDbJSON.Value("ALSO_KNOWN_AS") = ValueArray( AKAS ) IMDbJSON.Value("USA_TITLE") = USATitle Dim DateTableRows() as String = match_all( "<tr(.*?)<\/tr>", match( "id=""release_dates""(.*?)<\/table>", ReleaseInfoHTML ) ) Dim Dates() as String App.ErrorMessage = Info + " - " + "All country titles" For i as Integer = 0 to DateTableRows.Ubound Dim Country as String = match( "<a .*?>(.*?)<\/a>", DateTableRows(i), 1 ) Dim Date as String = match( "<td class=\""release_date\"">(.*?)</td>", DateTableRows(i), 1 ) date = Trim( RegExThis( Date, " <a href=\"".*?\"" >", ", " ).ReplaceAll("</a>","") ) if Country <> "" then Dates.Append Date + " = " + Country end if Next IMDbJSON.Value("RELEASE_DATES") = ValueArray( Dates ) // Storylines App.ErrorMessage = Info + " - " + "Storylines" Dim StoryLinesHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/plotsummary", 60 ), Encodings.UTF8 ) Sckt.Close dim storylist as String = match("id=""plot-summaries-content""(.*?)</ul>", StoryLinesHTML, 0) dim plots() as String = match_all("<li.*?>(.*?)<\/li>", storylist, 1) if plots <> Nil and plots.Ubound > -1 then for index as Integer = 0 to plots.Ubound plots(index) = RegExThis( plots(index), "(<div class=""author-container"">.*?</div>)", "" ) plots(index) = plots(index).RemoveTags plots(index) = DecodeHTML(plots(index)) plots(index) = Trim( plots(index) ) next IMDbJSON.Value("STORYLINES") = ValueArray( plots ) else IMDbJSON.Value("STORYLINES") = ValueArray(EmptyArray) end if 'IMDbJSON.Value("STORYLINES") = ValueArray( match_all( "<p class=""plotpar"">(.*?)(<i>|<a|<\/p)", StoryLinesHTML ) ) If IMDbJSON.Child("STORYLINES").Count >= 1 Then IMDbJSON.Value("STORYLINE") = IMDbJSON.Child("STORYLINES").Value(0) // Taglines App.ErrorMessage = Info + " - " + "Taglines" Dim TagLinesHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/taglines", 60 ), Encodings.UTF8 ) Sckt.Close IMDbJSON.Value("TAGLINES") = ValueArray( match_all( "<div class=\""soda.*?\"">(.*?)<\/div>", TagLinesHTML ) ) If IMDbJSON.Child("TAGLINES").Count >= 1 Then 'IMDbJSON.Child("TAGLINES").Remove(0) For i as Integer = 0 to IMDbJSON.Child("TAGLINES").Count -1 if IMDbJSON.Child("TAGLINES").Value(i) = IMDbJSON.Value("TAGLINE") then IMDbJSON.Child("TAGLINES").Remove(i) Continue end if if Str( IMDbJSON.Child("TAGLINES").Value(i) ).Contains("It looks like we don't have any Taglines for this title yet") then IMDbJSON.Child("TAGLINES").Remove(i) Continue end if Next End If // Recommended Titles dim recommendations() as String = match_all("<div class=""rec_item(.*?)</a>", Source, 0 ) dim recommendedTitles() as String if recommendations <> Nil and recommendations.Ubound > -1 then for each RecItem as String in recommendations dim rec_title, rec_id as String rec_title = RecItem.Match("title=""(.*?)""", 1) rec_id = RecItem.Match("<a href=""/title/(tt\d+).*?""", 1) recommendedTitles.Append rec_title + " [" + rec_id + "]" next end if IMDbJSON.Value("RECOMMENDATIONS") = ValueArray(recommendedTitles) 'App.ErrorMessage = Info + " - " + "Recommended Titles" 'Dim JSONString as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/widget/recommendations/_ajax/get_more_recs?specs=p13nsims%3A" + TitleID, 60 ), Encodings.UTF8 ) 'Sckt.Close 'App.ErrorMessage = Info + " - " + "Decoding from HTML" 'JSONString = Trim( JSONString ) 'Dim Recommendations as New JSONItem 'App.ErrorMessage = Info + " - " + "Loading recommendations" 'If JSONString <> "" And JSONString.Left(1) = "{" OR JSONString.Left(1) = "[" Then Recommendations.Load Trim( JSONString ) 'App.ErrorMessage = Info + " - " + "Setting recomendations child" 'If Recommendations <> Nil And Recommendations.HasName("recommendations") Then Recommendations = Recommendations.Child("recommendations") ' 'Dim RecIDs(), RecTitles(), Recs() as String 'App.ErrorMessage = Info + " - " + "Recommendations" 'For i as Integer = 0 to Recommendations.Count -1 'RecIDs.Append Recommendations.Child(i).Value("tconst") 'RecTitles.Append match( "title=""(.*?)""", Recommendations.Child(i).Value("content"), 1 ) 'Next ' 'For i as Integer = 0 to RecTitles.Ubound 'If RecIDs.Ubound >= i Then Recs.Append RecTitles(i) + " [" + RecIDs(i) + "]" Else Recs.Append RecTitles(i) 'Next 'If Recs.Ubound > -1 Then IMDbJSON.Value("RECOMMENDATIONS") = ValueArray( Recs ) // Media Images Dim MediaImagesHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/mediaindex", 60 ), Encodings.UTF8 ) Sckt.Close Dim links as String = match( "<div class=""thumb_list"" style=""font-size: 0px;"">(.*?)<\/div>", MediaImagesHTML, 1 ) Dim images() as String = match_all( "src=""(.*?)""", links ) IMDbJSON.Value("MEDIA_IMAGES") = ValueArray( images ) App.ErrorMessage = Info + " - " + "Media Images" For i as Integer = 0 to IMDbJSON.Child("MEDIA_IMAGES").Count -1 IMDbJSON.Child("MEDIA_IMAGES").Value(i) = RegExThis( IMDbJSON.Child("MEDIA_IMAGES").Value(i), "_V1\..*?.jpg", "_V1._SY0.jpg" ) Next // Certification Dim CertificationHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/parentalguide", 60 ), Encodings.UTF8 ) IMDbJSON.Value("CERTIFICATIONS") = ValueArray( match_all( "<a.*?>(.*?)<\/a>", match( "id=""certifications-list""(.*?)<\/table>", CertificationHTML, 1 ) ) ) // Full Cast If Prefs.boolForKey("IMDbFullCast") Then Dim FullCastHTML as String = DefineEncoding( Sckt.Get( "http://www.imdb.com/title/" + TitleID + "/fullcredits", 60 ), Encodings.utf8 ) Sckt.Close 'IMDbJSON.Value("CAST") = ValueArray( MatchArray( match_all( "<td class=""nm"">(.*?)<\/td>", FullCastHTML ), "<a.*?>(.*?)<\/a>" ) ) 'IMDbJSON.Value("ROLES") = ValueArray( match_all( "<td class=""char"">(.*?)<\/td>", FullCastHTML ) )'<a.*?>(.*?)<\/a>" ) ) 'IMDbJSON.Value("CASTTHUMBS") = ValueArray( MatchArray( match_all( "<td class=""hs"">(.*?)<\/td>", FullCastHTML ), "<img.*src=""(.*?)"".*><\/a" ) ) IMDbJSON.Value("CAST") = ValueArray( match_all( "<span class=""itemprop"" itemprop=""name"".*?>(.*?)<\/span>", FullCastHTML ) ) IMDbJSON.Value("ROLES") = ValueArray( match_all( "<td class=""character"">(.*?)<\/td>", FullCastHTML ) ) IMDbJSON.Value("CASTTHUMBS") = ValueArray( MatchArray( match_all( "<td class=""primary_photo"">(.*?)<\/td>", FullCastHTML ), "<img.*?loadlate=""(.*?)"".*><\/a" ) ) App.ErrorMessage = Info + " - " + "Actor ROLES" For i as Integer = 0 to IMDbJSON.Child("ROLES").Count -1 If IMDbJSON.Child("ROLES").Value(i).Instr( 0, "<a" ) > 0 Then IMDbJSON.Child("ROLES").Value(i) = match( "<a.*?>(.*?)<\/a>", IMDbJSON.Child("ROLES").Value(i), 1 ) End If if IMDbJSON.Child("ROLES").Value(i).Contains( "<div>" ) then IMDbJSON.Child("ROLES").Value(i) = Trim( match( "<div>(.*?)<\/div>", IMDbJSON.Child("ROLES").Value(i), 1 ) ) end if IMDbJSON.Child("ROLES").Value(i) = ReplaceAll( IMDbJSON.Child("ROLES").Value(i), " ", "" ) IMDbJSON.Child("ROLES").Value(i) = ReplaceAll( IMDbJSON.Child("ROLES").Value(i), "...", "" ) IMDbJSON.Child("ROLES").Value(i) = trim( IMDbJSON.Child("ROLES").Value(i) ) if IMDbJSON.Child("ROLES").Value(i).right(1) = "/" then IMDbJSON.Child("ROLES").Value(i) = Trim( IMDbJSON.Child("ROLES").Value(i).left( IMDbJSON.Child("ROLES").Value(i).len -1 ) ) end if IMDbJSON.Child("ROLES").Value(i) = Trim( RegExThis( IMDbJSON.Child("ROLES").Value(i), "\(.*\)" ) ) Next App.ErrorMessage = Info + " - " + "Cast Thumbs" For i as Integer = 0 to IMDbJSON.Child("CASTTHUMBS").Count -1 IMDbJSON.Child("CASTTHUMBS").Value(i) = RegExThis( IMDbJSON.Child("CASTTHUMBS").Value(i), "_V1.*?.jpg", "_V1_SY512.jpg" ) Next dim s as string End If End If App.ErrorMessage = "" Return IMDbJSON Exception err as OutOfBoundsException Dim w as New wndBugReporter w.Init( err, "GetIMDBJSON( " + TitleID + ", " + Str( Short ) + " )" + chr(13) + App.ErrorMessage ) App.ErrorMessage = "" Return Nil End Function #tag EndMethod #tag Method, Flags = &h21 Private Function MatchArray(Arry() as String, SrchPattern as String, i as Integer = 1) As String() Dim Arr() as String For each value as Variant in Arry Arr.Append Trim( match( SrchPattern, value, i ) ) Next Return Arr End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function RemoveTags(Text as String) As String 'Dim s as string = RegExThis( Text, "<\/span> »", "" ) // Don't be too agressive with links Text = RegExThis( Text, "<a.*?>", "" ) Text = ReplaceAll( Text, "</a>", "" ) Return RegExThis( Text, "<.*?<\/.*?>", "" ) End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function ValueArray(Values() as String) As JSONItem If Values <> Nil Then Dim Daddy as New JSONItem For i as Integer = 0 to Values.Ubound Daddy.Value(i) = Values(i) Next Return Daddy End If End Function #tag EndMethod #tag Constant, Name = kNotFoundOnGoogle, Type = String, Dynamic = True, Default = \"IMDb Search didn\'t find %title on google!", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"IMDb Search didn\'t find %title on Google!" #Tag Instance, Platform = Any, Language = nl, Definition = \"IMDb heeft %titel niet gevonden via Google!" #Tag Instance, Platform = Any, Language = fr, Definition = \"La recherche IMDB n\'a pas trouv\xC3\xA9 %title sur google !" #Tag Instance, Platform = Any, Language = de, Definition = \"Die IMDb-Suche kann %title bei Google nicht finden!" #tag EndConstant #tag Constant, Name = kNoTitleFoundOnIMDb, Type = String, Dynamic = True, Default = \"No title found on IMDb! %ID", Scope = Public #Tag Instance, Platform = Any, Language = en, Definition = \"No title found on IMDb! %ID" #Tag Instance, Platform = Any, Language = nl, Definition = \"Geen title gevonden op IMDb! %ID" #Tag Instance, Platform = Any, Language = de, Definition = \"Kein Titel IMDb gefunden! %ID" #Tag Instance, Platform = Any, Language = fr, Definition = \"Aucun titre trouv\xC3\xA9 sur IMDb! %ID" #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Index" Visible=true Group="ID" InitialValue="-2147483648" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag EndViewBehavior End Module #tag EndModule \ No newline at end of file diff --git a/ViMM/ViMM.rbvcp b/ViMM/ViMM.rbvcp old mode 100755 new mode 100644 index 370a8df..7df1b6c --- a/ViMM/ViMM.rbvcp +++ b/ViMM/ViMM.rbvcp @@ -1 +1 @@ -Type=Desktop RBProjectVersion=2012.021 MinIDEVersion=20070100 Class=App;App.rbbas;&h5FF03C73;&h0;false MenuBar=mBarMain;mBarMain.rbmnu;&h1471CA94;&h0;false FileTypeSet=FileTypes;FileTypes.rbbas;&h4DEE73DD;&h0;false Folder=Windows;Windows;&h5241B183;&h0;false Window=wndMain;Windows/wndMain.rbfrm;&h151114E0;&h5241B183;false Folder=Modules;Modules;&h298F9D05;&h0;false Folder=Translations;Modules/Translations;&h73420CB;&h298F9D05;false Folder=macoslib;Modules/macoslib;&h3CAB55D;&h298F9D05;false Folder=CoreServices;CoreServices;&h18E3FCD2;&h0;false Module=Loc;Modules/Translations/Loc.rbbas;&h48471A4E;&h73420CB;false Folder=Classes;Classes;&h61F91BC9;&h0;false Toolbar=ToolPrefs;Classes/ToolPrefs.rbtbar;&h38CFB01;&h61F91BC9;false Toolbar=ToolMain;Classes/ToolMain.rbtbar;&h427F5BFD;&h61F91BC9;false Toolbar=TbMetadataMovies;Classes/TbMetadataMovies.rbtbar;&h410A5093;&h61F91BC9;false Toolbar=TbMetadataShows;Classes/TbMetadataShows.rbtbar;&h787EAC27;&h61F91BC9;false Window=ccProgress;Classes/ccProgress.rbfrm;&h70D29A48;&h61F91BC9;false Class=cvsLogo;Classes/cvsLogo.rbbas;&h2E62D6D0;&h61F91BC9;false Folder=Images;Images;&h5510FB7A;&h0;false Picture=videocleansmall;Images/videoclean-small.png;&h185EB5B;&h5510FB7A;false;0;&h0 Picture=videoclean;Images/videoclean.png;&h5DCF8ED6;&h5510FB7A;false;0;&h0 Picture=videoclean2x;Images/videoclean@2x.png;&h8988ED;&h5510FB7A;false;0;&h0 Picture=videounwatchedsmall;Images/videounwatched-small.png;&h7F1EE5CA;&h5510FB7A;false;0;&h0 Picture=videounwatched;Images/videounwatched.png;&h5CCAF42E;&h5510FB7A;false;0;&h0 Picture=videounwatched2x;Images/videounwatched@2x.png;&h1EC4A669;&h5510FB7A;false;0;&h0 Picture=videowatchedsmall;Images/videowatched-small.png;&h4580B39F;&h5510FB7A;false;0;&h0 Picture=videowatched;Images/videowatched.png;&h10656940;&h5510FB7A;false;0;&h0 Picture=videowatched2x;Images/videowatched@2x.png;&h457CC187;&h5510FB7A;false;0;&h0 Folder=Resources;Resources;&h23881057;&h0;false BuildSteps=Build Automation;Build Automation.rbbas;&h3AAB06AE;&h0;false Class=ListboxPRO;Classes/ListboxPRO.rbbas;&h139E729;&h61F91BC9;false Class=LinkLabel;Classes/LinkLabel.rbbas;&h260E4C7C;&h61F91BC9;false Folder=LinkLabelCanvas;Classes/LinkLabelCanvas;&h3C526144;&h61F91BC9;false Class=LinkLabelCanvas;Classes/LinkLabelCanvas/LinkLabelCanvas.rbbas;&h6CBA6067;&h3C526144;false Window=ccCancelSave;Classes/ccCancelSave.rbfrm;&h53533074;&h61F91BC9;false Class=AddRemoveButtons;Classes/AddRemoveButtons.rbbas;&h66FE0580;&h61F91BC9;false Module=ViMMCore;Modules/ViMMCore.rbbas;&h7EAD4C74;&h298F9D05;false Module=CommonCore;Modules/CommonCore.rbbas;&h2469CD0C;&h298F9D05;false Folder=TTsMarsSplitter;Classes/TTsMarsSplitter;&h5BB976E9;&h61F91BC9;false Class=MarsSplitter;Classes/TTsMarsSplitter/MarsSplitter.rbbas;&h6D2E2BB0;&h5BB976E9;false Module=TTsUITools;Classes/TTsMarsSplitter/TTsUITools.rbbas;&h7236A975;&h5BB976E9;false Picture=aboutbg;Images/aboutbg.jpg;&h569AB73D;&h5510FB7A;false;0;&h0 Window=wndAbout;Windows/wndAbout.rbfrm;&h477473DC;&h5241B183;false Picture=Vitalis;Images/Vitalis.png;&h38879235;&h5510FB7A;false;0;&h0 Picture=Vitalis2x;Images/Vitalis@2x.png;&h1FF5C02E;&h5510FB7A;false;0;&h0 Module=Menu;Modules/Translations/Menu.rbbas;&h6F5534C4;&h73420CB;false Window=wndPreferences;Windows/wndPreferences.rbfrm;&h62C2FA2A;&h5241B183;false Picture=HelpActiveArrow;Classes/LinkLabelCanvas/HelpActiveArrow.png;&h1B34759E;&h3C526144;false;0;&h0 Picture=HelpInactiveArrow;Classes/LinkLabelCanvas/HelpInactiveArrow.png;&h111627AC;&h3C526144;false;0;&h0 Folder=Toolbar Icons;Images/Toolbar Icons;&h1CB3421F;&h5510FB7A;false Picture=ToolPreferences;Images/Toolbar Icons/ToolPreferences.png;&h3ED25B5;&h1CB3421F;false;0;&h0 Picture=ToolPreferences2x;Images/Toolbar Icons/ToolPreferences@2x.png;&h290F1FDF;&h1CB3421F;false;0;&h0 Picture=ToolMovies;Images/Toolbar Icons/ToolMovies.png;&h414A871E;&h1CB3421F;false;0;&h0 Picture=ToolTVShows;Images/Toolbar Icons/ToolTVShows.png;&h616CBDE6;&h1CB3421F;false;0;&h0 Picture=ToolMonitor;Images/Toolbar Icons/ToolMonitor.png;&h31E73120;&h1CB3421F;false;0;&h0 Picture=ToolUpdate;Images/Toolbar Icons/ToolUpdate.tiff;&h2A27BAA8;&h1CB3421F;false;0;&h0 Folder=ActionBar;Classes/ActionBar;&h44BF8D21;&h61F91BC9;false Class=ActionBar;Classes/ActionBar/ActionBar.rbbas;&h491D7EE9;&h44BF8D21;false Picture=ActionWidget;Classes/ActionBar/ActionWidget.png;&h7BCAD66F;&h44BF8D21;false;0;&h0 Module=Preferences;Modules/Preferences.rbbas;&h41C4928D;&h298F9D05;false Folder=SearchBar;Classes/SearchBar;&h11C5FE35;&h61F91BC9;false Window=wndSplash;Windows/wndSplash.rbfrm;&h2601D4F0;&h5241B183;false Module=Growl;Modules/Growl.rbbas;&h3A3001F4;&h298F9D05;false Module=nc;Modules/nc/nc.rbbas;&h4AA84F20;&h298F9D05;false Module=MovieAttr;CoreServices/MovieAttr.rbbas;&h1FEB8D68;&h18E3FCD2;false Module=TVAttr;CoreServices/TVAttr.rbbas;&h2190F8DD;&h18E3FCD2;false Module=AnimeAttr;CoreServices/AnimeAttr.rbbas;&h34C2C808;&h18E3FCD2;false Class=AniDB;CoreServices/AniDB.rbbas;&h2FF63174;&h18E3FCD2;false Class=TVRage;CoreServices/TVRage.rbbas;&h4E476018;&h18E3FCD2;false Class=TVMaze;CoreServices/TVMaze.rbbas;&h12032AE8;&h18E3FCD2;false Class=TVDBSckt;CoreServices/TVDBSckt.rbbas;&h1DCE6760;&h18E3FCD2;false Class=MovieSckt;CoreServices/MovieSckt.rbbas;&h23DD502A;&h18E3FCD2;false Module=MovieCore;CoreServices/MovieCore.rbbas;&h5FDAE1ED;&h18E3FCD2;false Module=TVCore;CoreServices/TVCore.rbbas;&h5DFA8D3D;&h18E3FCD2;false Folder=Rating;Images/Rating;&h5EFD8BE3;&h5510FB7A;false Folder=MovieDataTags;Images/MovieDataTags;&h6E81FC20;&h5510FB7A;false Folder=MovieDataTags@2x;Images/MovieDataTags@2x;&h62FA8680;&h5510FB7A;false Picture=Rating_G;Images/Rating/Rating_G.png;&h57EB5673;&h5EFD8BE3;false;0;&h0 Picture=Rating_NC17;Images/Rating/Rating_NC-17.png;&h1B7906C3;&h5EFD8BE3;false;0;&h0 Picture=Rating_PG13;Images/Rating/Rating_PG-13.png;&h26AB3BF2;&h5EFD8BE3;false;0;&h0 Picture=Rating_PG;Images/Rating/Rating_PG.png;&h33ECE259;&h5EFD8BE3;false;0;&h0 Picture=Rating_R;Images/Rating/Rating_R.png;&h5009D57;&h5EFD8BE3;false;0;&h0 Picture=Rating_TV14;Images/Rating/Rating_TV-14.png;&h6B59FEF7;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVG;Images/Rating/Rating_TV-G.png;&h617282D6;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVMA;Images/Rating/Rating_TV-MA.png;&h24EC233B;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVPG;Images/Rating/Rating_TV-PG.png;&hAFD4B13;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVY;Images/Rating/Rating_TV-Y.png;&h7B4C13AD;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVY7;Images/Rating/Rating_TV-Y7.png;&h3FA043BE;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVY7FV;Images/Rating/Rating_TV-Y7FV.png;&h32BFD13A;&h5EFD8BE3;false;0;&h0 Picture=rtratingcertified;Images/Rating/rt-rating-certified.png;&hB157621;&h5EFD8BE3;false;0;&h0 Picture=rtratingfresh;Images/Rating/rt-rating-fresh.png;&h2DFEB7DC;&h5EFD8BE3;false;0;&h0 Picture=rtratingrotten;Images/Rating/rt-rating-rotten.png;&h2DD925C1;&h5EFD8BE3;false;0;&h0 Picture=rtratingupright;Images/Rating/rt-rating-upright.png;&h122E6081;&h5EFD8BE3;false;0;&h0 Picture=rtratingspilled;Images/Rating/rt-rating-spilled.png;&hB3DFB11;&h5EFD8BE3;false;0;&h0 Class=ListMovies;Classes/ListMovies.rbbas;&h2163D1CE;&h61F91BC9;false Class=ListTVShows;Classes/ListTVShows.rbbas;&h7D599A01;&h61F91BC9;false Folder=FanArt;Images/FanArt;&h2EDA3B96;&h5510FB7A;false Folder=Help Button;Images/Help Button;&h7D44DC01;&h5510FB7A;false Folder=Kijkwijzer;Images/Kijkwijzer;&h18C3ECA5;&h5510FB7A;false Picture=BannerOverlay;Images/FanArt/BannerOverlay.png;&h53560107;&h2EDA3B96;false;0;&h0 Picture=IMGFanartOverlay;Images/FanArt/IMGFanartOverlay.png;&h335DDEF5;&h2EDA3B96;false;0;&h0 Picture=IMGmovies;Images/FanArt/IMGmovies.jpg;&h57D902D1;&h2EDA3B96;false;0;&h0 Picture=IMGtvshows;Images/FanArt/IMGtvshows.jpg;&h6848560B;&h2EDA3B96;false;0;&h0 Picture=miniconmovie;Images/minicon-movie.png;&h341DD4E8;&h5510FB7A;false;0;&h0 Class=ExtraArtCanvas;Classes/ExtraArtCanvas.rbbas;&h69AD46E7;&h61F91BC9;false Window=dlgProgress;Windows/dlgProgress.rbfrm;&h4B33AA6;&h5241B183;false Class=SuperTextfield;Classes/SuperTextfield.rbbas;&h1657E410;&h61F91BC9;false Class=SuperTextArea;Classes/SuperTextArea.rbbas;&h643E238B;&h61F91BC9;false Picture=sweep;Images/sweep.png;&h659103B9;&h5510FB7A;false;0;&h0 Picture=Boxee;Images/Boxee.png;&h5ADD2DCD;&h5510FB7A;false;0;&h0 Class=MyHierListBox;Classes/MyHierListBox.rbbas;&h45F6773A;&h61F91BC9;false Folder=NL;Images/Rating/NL;&h63BA13FB;&h5EFD8BE3;false Folder=UK;Images/Rating/UK;&h4D763889;&h5EFD8BE3;false Folder=DE;Images/Rating/DE;&hC7A13C0;&h5EFD8BE3;false Picture=Rating_FSK0;Images/Rating/de/Rating_FSK-0.png;&h22A6EA4C;&hC7A13C0;false;0;&h0 Picture=Rating_FSK6;Images/Rating/de/Rating_FSK-6.png;&h7C6076FF;&hC7A13C0;false;0;&h0 Picture=Rating_FSK12;Images/Rating/de/Rating_FSK-12.png;&h2124E0CA;&hC7A13C0;false;0;&h0 Picture=Rating_FSK16;Images/Rating/de/Rating_FSK-16.png;&h7C22406B;&hC7A13C0;false;0;&h0 Picture=Rating_FSK18;Images/Rating/de/Rating_FSK-18.png;&h2CB3B21E;&hC7A13C0;false;0;&h0 Picture=Rating_UK12;Images/Rating/UK/Rating_UK-12.png;&h49732825;&h4D763889;false;0;&h0 Picture=Rating_UK12A;Images/Rating/UK/Rating_UK-12A.png;&h2750FC75;&h4D763889;false;0;&h0 Picture=Rating_UK15;Images/Rating/UK/Rating_UK-15.png;&h35EEBB23;&h4D763889;false;0;&h0 Picture=Rating_UK18;Images/Rating/UK/Rating_UK-18.png;&h4C405424;&h4D763889;false;0;&h0 Picture=Rating_UKPG;Images/Rating/UK/Rating_UK-PG.png;&h1354703E;&h4D763889;false;0;&h0 Picture=Rating_UKU;Images/Rating/UK/Rating_UK-U.png;&hC954202;&h4D763889;false;0;&h0 Picture=Rating_UKUc;Images/Rating/UK/Rating_UK-Uc.png;&h1B20D968;&h4D763889;false;0;&h0 Picture=Rating_UKR18;Images/Rating/UK/Rating_UK-R18.png;&h24465C5E;&h4D763889;false;0;&h0 Picture=Rating_NL6;Images/Rating/NL/Rating_NL-6.png;&h9A18A68;&h63BA13FB;false;0;&h0 Picture=Rating_NL9;Images/Rating/NL/Rating_NL-9.png;&h4C85F86E;&h63BA13FB;false;0;&h0 Picture=Rating_NL12;Images/Rating/NL/Rating_NL-12.png;&h6F7966A7;&h63BA13FB;false;0;&h0 Picture=Rating_NL16;Images/Rating/NL/Rating_NL-16.png;&hB42D8C4;&h63BA13FB;false;0;&h0 Picture=Rating_NLAL;Images/Rating/NL/Rating_NL-AL.png;&h51A57348;&h63BA13FB;false;0;&h0 Folder=FR;Images/Rating/FR;&h52A36656;&h5EFD8BE3;false Picture=Rating_FR10;Images/Rating/FR/Rating_FR-10.png;&h65940422;&h52A36656;false;0;&h0 Picture=Rating_FR12;Images/Rating/FR/Rating_FR-12.png;&h589BC9ED;&h52A36656;false;0;&h0 Picture=Rating_FR16;Images/Rating/FR/Rating_FR-16.png;&h5BE655B3;&h52A36656;false;0;&h0 Picture=Rating_FR18;Images/Rating/FR/Rating_FR-18.png;&h6F04CB8D;&h52A36656;false;0;&h0 Picture=Rating_FRU;Images/Rating/FR/Rating_FR-U.png;&h23D01092;&h52A36656;false;0;&h0 Picture=XBMC;Images/XBMC.png;&h1EAFDCAB;&h5510FB7A;false;0;&h0 Picture=YAMJ;Images/YAMJ.png;&h2BC0AFF0;&h5510FB7A;false;0;&h0 Folder=Obsolete;Obsolete;&h54E45B12;&h0;false Window=ccSearch;Classes/SearchBar/ccSearch.rbfrm;&h1B441135;&h11C5FE35;false Picture=remove;Classes/SearchBar/remove.png;&h5DB49456;&h11C5FE35;false;0;&h0 Picture=removepressed;Classes/SearchBar/removepressed.png;&h7A770BCF;&h11C5FE35;false;0;&h0 Picture=searchglass;Classes/SearchBar/searchglass.png;&h1DA8C37F;&h11C5FE35;false;0;&h0 Picture=HelpButton;Images/Help Button/HelpButton.png;&h33C8478D;&h7D44DC01;false;0;&h0 Picture=HelpButtonInactive;Images/Help Button/HelpButtonInactive.png;&h21D1D630;&h7D44DC01;false;0;&h0 Picture=HelpButtonPressed;Images/Help Button/HelpButtonPressed.png;&h57453C4E;&h7D44DC01;false;0;&h0 Class=btnImage;Classes/btnImage.rbbas;&h1AC435C1;&h61F91BC9;false Class=TrailerSckt;CoreServices/TrailerSckt.rbbas;&h57B2FA7A;&h18E3FCD2;false Window=ccThumbView;Classes/ccThumbView.rbfrm;&h60C0C05E;&h61F91BC9;false Folder=FI;Images/Rating/FI;&h75A7393;&h5EFD8BE3;false Picture=Rating_FIK7;Images/Rating/FI/Rating_FI-K7.png;&h4359FD50;&h75A7393;false;0;&h0 Picture=Rating_FIK11;Images/Rating/FI/Rating_FI-K11.png;&h1AAA2C07;&h75A7393;false;0;&h0 Picture=Rating_FIK12;Images/Rating/FI/Rating_FI-K12.png;&h4905F361;&h75A7393;false;0;&h0 Picture=Rating_FIK16;Images/Rating/FI/Rating_FI-K16.png;&h25ADCC61;&h75A7393;false;0;&h0 Picture=Rating_FIK18;Images/Rating/FI/Rating_FI-K18.png;&h35454940;&h75A7393;false;0;&h0 Picture=Rating_FIKE;Images/Rating/FI/Rating_FI-KE.png;&h57CC65B8;&h75A7393;false;0;&h0 Picture=Rating_FIS;Images/Rating/FI/Rating_FI-S.png;&h2C2A81B6;&h75A7393;false;0;&h0 Folder=Misc;Images/Rating/Misc;&h1A30CEE4;&h5EFD8BE3;false Picture=Rating_U;Images/Rating/Misc/Rating_U.png;&h3A18BEA3;&h1A30CEE4;false;0;&h0 Picture=Rating_10;Images/Rating/Misc/Rating_10.png;&h7A5F29D0;&h1A30CEE4;false;0;&h0 Picture=Rating_11;Images/Rating/Misc/Rating_11.png;&h7DB29719;&h1A30CEE4;false;0;&h0 Picture=Rating_12;Images/Rating/Misc/Rating_12.png;&h57DE6C6D;&h1A30CEE4;false;0;&h0 Picture=Rating_13;Images/Rating/Misc/Rating_13.png;&h4BA0D6D2;&h1A30CEE4;false;0;&h0 Picture=Rating_14;Images/Rating/Misc/Rating_14.png;&h2C77DD6E;&h1A30CEE4;false;0;&h0 Picture=Rating_15;Images/Rating/Misc/Rating_15.png;&h716AB936;&h1A30CEE4;false;0;&h0 Picture=Rating_16;Images/Rating/Misc/Rating_16.png;&h15A6040C;&h1A30CEE4;false;0;&h0 Picture=Rating_17;Images/Rating/Misc/Rating_17.png;&h4653FC94;&h1A30CEE4;false;0;&h0 Picture=Rating_18;Images/Rating/Misc/Rating_18.png;&h33EBBE44;&h1A30CEE4;false;0;&h0 Picture=Rating_PG12;Images/Rating/Misc/Rating_PG-12.png;&h2E8C1EC7;&h1A30CEE4;false;0;&h0 Module=Genre;Modules/Translations/Genre.rbbas;&h2249E31F;&h73420CB;false Picture=IMDbTop250;Images/IMDbTop250.png;&h7BD9509A;&h5510FB7A;false;0;&h0 Class=cvsMovieViewer;Obsolete/cvsMovieViewer.rbbas;&h52205592;&h54E45B12;false Picture=toolbg;Images/toolbg.png;&h48D25003;&h5510FB7A;false;0;&h0 Picture=banneractive;Images/MovieDataTags/banner-active.png;&h17D01334;&h6E81FC20;false;0;&h0 Picture=bannerinactive;Images/MovieDataTags/banner-inactive.png;&h5D9D08C8;&h6E81FC20;false;0;&h0 Picture=bluactive;Images/MovieDataTags/blu-active.png;&h4A6E99E3;&h6E81FC20;false;0;&h0 Picture=bluinactive;Images/MovieDataTags/blu-inactive.png;&h23396DE8;&h6E81FC20;false;0;&h0 Picture=characteractive;Images/MovieDataTags/character-active.png;&h7DB3549A;&h6E81FC20;false;0;&h0 Picture=characterinactive;Images/MovieDataTags/character-inactive.png;&h877CC95;&h6E81FC20;false;0;&h0 Picture=def1080pactive;Images/MovieDataTags/def1080p-active.png;&h30A1334B;&h6E81FC20;false;0;&h0 Picture=def1080pinactive;Images/MovieDataTags/def1080p-inactive.png;&h272EDB84;&h6E81FC20;false;0;&h0 Picture=def720pactive;Images/MovieDataTags/def720p-active.png;&h754E0CDA;&h6E81FC20;false;0;&h0 Picture=def720pinactive;Images/MovieDataTags/def720p-inactive.png;&h572E3A06;&h6E81FC20;false;0;&h0 Picture=defHDactive;Images/MovieDataTags@2x/defHD-active@2x.png;&h1BE3CE47;&h6E81FC20;false;0;&h0 Picture=defHDinactive;Images/MovieDataTags@2x/defHD-inactive@2x.png;&h8FBE745;&h6E81FC20;false;0;&h0 Picture=defSDactive;Images/MovieDataTags/defSD-active.png;&h520CA944;&h6E81FC20;false;0;&h0 Picture=defSDinactive;Images/MovieDataTags/defSD-inactive.png;&h3D3D1B17;&h6E81FC20;false;0;&h0 Picture=discartactive;Images/MovieDataTags/discart-active.png;&h76BDE40F;&h6E81FC20;false;0;&h0 Picture=discartinactive;Images/MovieDataTags/discart-inactive.png;&h2CC81356;&h6E81FC20;false;0;&h0 Picture=DVDactive;Images/MovieDataTags/DVD-active.png;&h779E29C3;&h6E81FC20;false;0;&h0 Picture=DVDinactive;Images/MovieDataTags/DVD-inactive.png;&h30C84035;&h6E81FC20;false;0;&h0 Picture=extrafanartactive;Images/MovieDataTags/extrafanart-active.png;&h3058E619;&h6E81FC20;false;0;&h0 Picture=extrafanartinactive;Images/MovieDataTags/extrafanart-inactive.png;&h1C6ACDC1;&h6E81FC20;false;0;&h0 Picture=extrathumbsactive;Images/MovieDataTags/extrathumbs-active.png;&h43EDA2D4;&h6E81FC20;false;0;&h0 Picture=extrathumbsinactive;Images/MovieDataTags/extrathumbs-inactive.png;&h265D70C9;&h6E81FC20;false;0;&h0 Picture=fanartactive;Images/MovieDataTags/fanart-active.png;&h4A5F7536;&h6E81FC20;false;0;&h0 Picture=fanartinactive;Images/MovieDataTags/fanart-inactive.png;&h41089405;&h6E81FC20;false;0;&h0 Picture=landscapeactive;Images/MovieDataTags/landscape-active.png;&h2527422F;&h6E81FC20;false;0;&h0 Picture=landscapeinactive;Images/MovieDataTags/landscape-inactive.png;&h346A705D;&h6E81FC20;false;0;&h0 Picture=posteractive;Images/MovieDataTags/poster-active.png;&h2C8572E8;&h6E81FC20;false;0;&h0 Picture=posterinactive;Images/MovieDataTags/poster-inactive.png;&h6D3B35D3;&h6E81FC20;false;0;&h0 Picture=subtitlesactive;Images/MovieDataTags/subtitles-active.png;&h2C70373A;&h6E81FC20;false;0;&h0 Picture=subtitlesinactive;Images/MovieDataTags/subtitles-inactive.png;&h7B3A1946;&h6E81FC20;false;0;&h0 Picture=traileractive;Images/MovieDataTags/trailer-active.png;&hC18879B;&h6E81FC20;false;0;&h0 Picture=trailerinactive;Images/MovieDataTags/trailer-inactive.png;&h1E6F18F7;&h6E81FC20;false;0;&h0 Picture=posterbg;Images/posterbg.png;&h7043D0;&h5510FB7A;false;0;&h0 Folder=Metatags;Images/Metatags;&h3C0EB9D;&h5510FB7A;false Picture=metatagsaudioaac;Images/Metatags/metatags-audio-aac.png;&h6EACD3FD;&h3C0EB9D;false;0;&h0 Picture=metatagsaudioac3;Images/Metatags/metatags-audio-ac3.png;&h14920175;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiodts;Images/Metatags/metatags-audio-dts.png;&h7D9DF485;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiomp3;Images/Metatags/metatags-audio-mp3.png;&hD20C9D7;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiompeg;Images/Metatags/metatags-audio-mpeg.png;&h63A38AA2;&h3C0EB9D;false;0;&h0 Picture=metatagschannels;Images/Metatags/metatags-channels.png;&h5E3066F;&h3C0EB9D;false;0;&h0 Picture=metatagsrating;Images/Metatags/metatags-rating.png;&h7BBBA613;&h3C0EB9D;false;0;&h0 Picture=metatagsratio133;Images/Metatags/metatags-ratio-1.33.png;&h5C94AA81;&h3C0EB9D;false;0;&h0 Picture=metatagsratio166;Images/Metatags/metatags-ratio-1.66.png;&h24466C49;&h3C0EB9D;false;0;&h0 Picture=metatagsratio178;Images/Metatags/metatags-ratio-1.78.png;&hB6F80E0;&h3C0EB9D;false;0;&h0 Picture=metatagsratio185;Images/Metatags/metatags-ratio-1.85.png;&h457639A3;&h3C0EB9D;false;0;&h0 Picture=metatagsratio235;Images/Metatags/metatags-ratio-2.35.png;&h54C2619B;&h3C0EB9D;false;0;&h0 Picture=metatagsratio239;Images/Metatags/metatags-ratio-2.39.png;&h2596743C;&h3C0EB9D;false;0;&h0 Picture=metatagsratio240;Images/Metatags/metatags-ratio-2.40.png;&h38A96411;&h3C0EB9D;false;0;&h0 Picture=metatagsratiowidescreen;Images/Metatags/metatags-ratio-widescreen.png;&h78E8F6CC;&h3C0EB9D;false;0;&h0 Picture=metatagsratio;Images/Metatags/metatags-ratio.png;&h6A34ABE;&h3C0EB9D;false;0;&h0 Picture=metatagsvideodivx;Images/Metatags/metatags-video-divx.png;&h4A8044FF;&h3C0EB9D;false;0;&h0 Picture=metatagsvideoh264;Images/Metatags/metatags-video-h264.png;&h2B322935;&h3C0EB9D;false;0;&h0 Picture=metatagsvideompeg;Images/Metatags/metatags-video-mpeg.png;&h6A2FAE60;&h3C0EB9D;false;0;&h0 Picture=metatagsvideoxvid;Images/Metatags/metatags-video-xvid.png;&h606198BC;&h3C0EB9D;false;0;&h0 Picture=metatags;Images/Metatags/metatags.png;&h2772D1B9;&h3C0EB9D;false;0;&h0 Picture=metatagsresolution;Images/Metatags/metatags-resolution.png;&h1D47F471;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiowma;Images/Metatags/metatags-audio-wma.png;&h5F017761;&h3C0EB9D;false;0;&h0 Picture=starring;Images/starring.png;&h1FA75B0D;&h5510FB7A;false;0;&h0 Picture=kw_discrimination;Images/Kijkwijzer/kw_discrimination.png;&h66E592FC;&h18C3ECA5;false;0;&h0 Picture=kw_drugs;Images/Kijkwijzer/kw_drugs.png;&h6A1554D0;&h18C3ECA5;false;0;&h0 Picture=kw_fear;Images/Kijkwijzer/kw_fear.png;&h1E739BBF;&h18C3ECA5;false;0;&h0 Picture=kw_language;Images/Kijkwijzer/kw_language.png;&h37F669DD;&h18C3ECA5;false;0;&h0 Picture=kw_sex;Images/Kijkwijzer/kw_sex.png;&h12A08A85;&h18C3ECA5;false;0;&h0 Picture=kw_violence;Images/Kijkwijzer/kw_violence.png;&h69E66CF6;&h18C3ECA5;false;0;&h0 Folder=tb icons;Images/tb icons;&h16FC0271;&h5510FB7A;false Picture=tb_animeselected;Images/tb icons/tb_anime-selected.png;&h7B049626;&h16FC0271;false;0;&h0 Picture=tb_animeselected2x;Images/tb icons/tb_anime-selected@2x.png;&h6A1E1988;&h16FC0271;false;0;&h0 Picture=tb_anime;Images/tb icons/tb_anime.png;&h5E1EA7CB;&h16FC0271;false;0;&h0 Picture=tb_anime2x;Images/tb icons/tb_anime@2x.png;&h2E9A7259;&h16FC0271;false;0;&h0 Picture=tb_clean;Images/tb icons/tb_clean.png;&h1DC98A9C;&h16FC0271;false;0;&h0 Picture=tb_clean2x;Images/tb icons/tb_clean@2x.png;&h1AAB58B1;&h16FC0271;false;0;&h0 Picture=tb_clean4x;Images/tb icons/tb_clean@4x.png;&h674C1BCA;&h16FC0271;false;0;&h0 Picture=tb_donate;Images/tb icons/tb_donate.png;&h35B4E167;&h16FC0271;false;0;&h0 Picture=tb_donate2x;Images/tb icons/tb_donate@2x.png;&h763A8E62;&h16FC0271;false;0;&h0 Picture=tb_editor;Images/tb icons/tb_editor.png;&h7E5A4237;&h16FC0271;false;0;&h0 Picture=tb_editor2x;Images/tb icons/tb_editor@2x.png;&h57B1AB55;&h16FC0271;false;0;&h0 Picture=tb_extras;Images/tb icons/tb_extras.png;&h5167C813;&h16FC0271;false;0;&h0 Picture=tb_extras2x;Images/tb icons/tb_extras@2x.png;&h7480C2CB;&h16FC0271;false;0;&h0 Picture=tb_fetch;Images/tb icons/tb_fetch.png;&h31751AD4;&h16FC0271;false;0;&h0 Picture=tb_fetch2x;Images/tb icons/tb_fetch@2x.png;&h7F34AF4F;&h16FC0271;false;0;&h0 Picture=tb_fetchall;Images/tb icons/tb_fetchall.png;&h5BE1EE6D;&h16FC0271;false;0;&h0 Picture=tb_fetchall2x;Images/tb icons/tb_fetchall@2x.png;&h4DECA6E1;&h16FC0271;false;0;&h0 Picture=tb_metaimagesselected;Images/tb icons/tb_metaimages-selected.png;&h6BC06764;&h16FC0271;false;0;&h0 Picture=tb_metaimagesselected2x;Images/tb icons/tb_metaimages-selected@2x.png;&h24C44F26;&h16FC0271;false;0;&h0 Picture=tb_metaimages;Images/tb icons/tb_metaimages.png;&h54289C4B;&h16FC0271;false;0;&h0 Picture=tb_metaimages2x;Images/tb icons/tb_metaimages@2x.png;&h362D6CBD;&h16FC0271;false;0;&h0 Picture=tb_metainfoselected;Images/tb icons/tb_metainfo-selected.png;&h603E49BA;&h16FC0271;false;0;&h0 Picture=tb_metainfoselected2x;Images/tb icons/tb_metainfo-selected@2x.png;&h195AC559;&h16FC0271;false;0;&h0 Picture=tb_metainfo;Images/tb icons/tb_metainfo.png;&h1652A4B6;&h16FC0271;false;0;&h0 Picture=tb_metainfo2x;Images/tb icons/tb_metainfo@2x.png;&hBBBF5D3;&h16FC0271;false;0;&h0 Picture=tb_metapeopleselected;Images/tb icons/tb_metapeople-selected.png;&h6108374F;&h16FC0271;false;0;&h0 Picture=tb_metapeopleselected2x;Images/tb icons/tb_metapeople-selected@2x.png;&h626796F3;&h16FC0271;false;0;&h0 Picture=tb_metapeople;Images/tb icons/tb_metapeople.png;&h7EE79FA3;&h16FC0271;false;0;&h0 Picture=tb_metapeople2x;Images/tb icons/tb_metapeople@2x.png;&h18A20912;&h16FC0271;false;0;&h0 Picture=tb_metarecmoviesselected;Images/tb icons/tb_metarecmovies-selected.png;&h3601CB06;&h16FC0271;false;0;&h0 Picture=tb_metarecmoviesselected2x;Images/tb icons/tb_metarecmovies-selected@2x.png;&h2FB85443;&h16FC0271;false;0;&h0 Picture=tb_metarecmovies;Images/tb icons/tb_metarecmovies.png;&h6EA454D4;&h16FC0271;false;0;&h0 Picture=tb_metarecmovies2x;Images/tb icons/tb_metarecmovies@2x.png;&h66BDA4B1;&h16FC0271;false;0;&h0 Picture=tb_metasummaryselected;Images/tb icons/tb_metasummary-selected.png;&h2C87D6CF;&h16FC0271;false;0;&h0 Picture=tb_metasummaryselected2x;Images/tb icons/tb_metasummary-selected@2x.png;&hA280886;&h16FC0271;false;0;&h0 Picture=tb_metasummary;Images/tb icons/tb_metasummary.png;&h4A47DC45;&h16FC0271;false;0;&h0 Picture=tb_metasummary2x;Images/tb icons/tb_metasummary@2x.png;&h33CE9DC2;&h16FC0271;false;0;&h0 Picture=tb_metatrailersselected;Images/tb icons/tb_metatrailers-selected.png;&h41D787C6;&h16FC0271;false;0;&h0 Picture=tb_metatrailersselected2x;Images/tb icons/tb_metatrailers-selected@2x.png;&h2D133B95;&h16FC0271;false;0;&h0 Picture=tb_metatrailers;Images/tb icons/tb_metatrailers.png;&h49AD0BF7;&h16FC0271;false;0;&h0 Picture=tb_metatrailers2x;Images/tb icons/tb_metatrailers@2x.png;&h7FECEC90;&h16FC0271;false;0;&h0 Picture=tb_moviesselected;Images/tb icons/tb_movies-selected.png;&h1B9F6533;&h16FC0271;false;0;&h0 Picture=tb_moviesselected2x;Images/tb icons/tb_movies-selected@2x.png;&h7DAD4715;&h16FC0271;false;0;&h0 Picture=tb_movies;Images/tb icons/tb_movies.png;&h7B1635CE;&h16FC0271;false;0;&h0 Picture=tb_movies2x;Images/tb icons/tb_movies@2x.png;&h6F26E829;&h16FC0271;false;0;&h0 Picture=tb_prefssettingsselected2x;Images/tb icons/tb_prefssettings-selected@2x.png;&h63545667;&h16FC0271;false;0;&h0 Picture=tb_prefssettings2x;Images/tb icons/tb_prefssettings@2x.png;&h35F4F8C9;&h16FC0271;false;0;&h0 Picture=tb_prefsupdatesselected;Images/tb icons/tb_prefsupdates-selected.png;&h65F9B171;&h16FC0271;false;0;&h0 Picture=tb_prefsupdatesselected2x;Images/tb icons/tb_prefsupdates-selected@2x.png;&h6BF0E7AA;&h16FC0271;false;0;&h0 Picture=tb_prefsupdates;Images/tb icons/tb_prefsupdates.png;&h14F9C2E9;&h16FC0271;false;0;&h0 Picture=tb_prefsupdates2x;Images/tb icons/tb_prefsupdates@2x.png;&h196B9B67;&h16FC0271;false;0;&h0 Picture=tb_refresh;Images/tb icons/tb_refresh.png;&h67A7D5E0;&h16FC0271;false;0;&h0 Picture=tb_refresh2x;Images/tb icons/tb_refresh@2x.png;&h3BCADBF0;&h16FC0271;false;0;&h0 Picture=tb_search;Images/tb icons/tb_search.png;&h32DC9E1;&h16FC0271;false;0;&h0 Picture=tb_search2x;Images/tb icons/tb_search@2x.png;&h3321160E;&h16FC0271;false;0;&h0 Picture=tb_setsmanager;Images/tb icons/tb_setsmanager.png;&h412F4D01;&h16FC0271;false;0;&h0 Picture=tb_setsmanager2x;Images/tb icons/tb_setsmanager@2x.png;&h868DFBC;&h16FC0271;false;0;&h0 Picture=tb_televisionselected;Images/tb icons/tb_television-selected.png;&h1D38F59A;&h16FC0271;false;0;&h0 Picture=tb_televisionselected2x;Images/tb icons/tb_television-selected@2x.png;&h684A219;&h16FC0271;false;0;&h0 Picture=tb_television;Images/tb icons/tb_television.png;&h6DAE5C4C;&h16FC0271;false;0;&h0 Picture=tb_television2x;Images/tb icons/tb_television@2x.png;&h522DFB7B;&h16FC0271;false;0;&h0 Picture=traileractive2x;Images/MovieDataTags@2x/trailer-active@2x.png;&h2D94B1EA;&h62FA8680;false;0;&h0 Picture=trailerinactive2x;Images/MovieDataTags@2x/trailer-inactive@2x.png;&h7D2CD2AC;&h62FA8680;false;0;&h0 Picture=posteractive2x;Images/MovieDataTags@2x/poster-active@2x.png;&h10CB0DC4;&h62FA8680;false;0;&h0 Picture=posterinactive2x;Images/MovieDataTags@2x/poster-inactive@2x.png;&h2F5091F;&h62FA8680;false;0;&h0 Picture=fanartactive2x;Images/MovieDataTags@2x/fanart-active@2x.png;&h2BF24148;&h62FA8680;false;0;&h0 Picture=fanartinactive2x;Images/MovieDataTags@2x/fanart-inactive@2x.png;&h2D9C3628;&h62FA8680;false;0;&h0 Picture=landscapeactive2x;Images/MovieDataTags@2x/landscape-active@2x.png;&h5793104B;&h62FA8680;false;0;&h0 Picture=landscapeinactive2x;Images/MovieDataTags@2x/landscape-inactive@2x.png;&h78131A7D;&h62FA8680;false;0;&h0 Picture=discartactive2x;Images/MovieDataTags@2x/discart-active@2x.png;&h28CABE21;&h62FA8680;false;0;&h0 Picture=discartinactive2x;Images/MovieDataTags@2x/discart-inactive@2x.png;&h1688BF19;&h62FA8680;false;0;&h0 Picture=subtitlesactive2x;Images/MovieDataTags@2x/subtitles-active@2x.png;&h66EC5A4B;&h62FA8680;false;0;&h0 Picture=subtitlesinactive2x;Images/MovieDataTags@2x/subtitles-inactive@2x.png;&h271C685D;&h62FA8680;false;0;&h0 Picture=banneractive2x;Images/MovieDataTags@2x/banner-active@2x.png;&h35F30D61;&h62FA8680;false;0;&h0 Picture=bannerinactive2x;Images/MovieDataTags@2x/banner-inactive@2x.png;&h67F3B898;&h62FA8680;false;0;&h0 Picture=characteractive2x;Images/MovieDataTags@2x/character-active@2x.png;&h1893AF5;&h62FA8680;false;0;&h0 Picture=characterinactive2x;Images/MovieDataTags@2x/character-inactive@2x.png;&h587DED42;&h62FA8680;false;0;&h0 Picture=extrafanartactive2x;Images/MovieDataTags@2x/extrafanart-active@2x.png;&h1BE98F45;&h62FA8680;false;0;&h0 Picture=extrafanartinactive2x;Images/MovieDataTags@2x/extrafanart-inactive@2x.png;&h2BD4AFA;&h62FA8680;false;0;&h0 Picture=extrathumbsactive2x;Images/MovieDataTags@2x/extrathumbs-active@2x.png;&h3C541952;&h62FA8680;false;0;&h0 Picture=extrathumbsinactive2x;Images/MovieDataTags@2x/extrathumbs-inactive@2x.png;&h354AB715;&h62FA8680;false;0;&h0 Picture=bluactive2x;Images/MovieDataTags@2x/blu-active@2x.png;&h28567BBE;&h62FA8680;false;0;&h0 Picture=bluinactive2x;Images/MovieDataTags@2x/blu-inactive@2x.png;&h45D64D48;&h62FA8680;false;0;&h0 Picture=def720pactive2x;Images/MovieDataTags@2x/def720p-active@2x.png;&h2887F88;&h62FA8680;false;0;&h0 Picture=def720pinactive2x;Images/MovieDataTags@2x/def720p-inactive@2x.png;&h4F6CFCAA;&h62FA8680;false;0;&h0 Picture=def1080pactive2x;Images/MovieDataTags@2x/def1080p-active@2x.png;&h7C406748;&h62FA8680;false;0;&h0 Picture=def1080pinactive2x;Images/MovieDataTags@2x/def1080p-inactive@2x.png;&h683D2958;&h62FA8680;false;0;&h0 Picture=defSDactive2x;Images/MovieDataTags@2x/defSD-active@2x.png;&h765C785;&h62FA8680;false;0;&h0 Picture=defSDinactive2x;Images/MovieDataTags@2x/defSD-inactive@2x.png;&h2B0E3234;&h62FA8680;false;0;&h0 Picture=DVDactive2x;Images/MovieDataTags@2x/DVD-active@2x.png;&h31024BA7;&h62FA8680;false;0;&h0 Picture=DVDinactive2x;Images/MovieDataTags@2x/DVD-inactive@2x.png;&hDB51BBA;&h62FA8680;false;0;&h0 Picture=defHDactive2x;Images/MovieDataTags@2x/defHD-active@2x.png;&h737D3572;&h62FA8680;false;0;&h0 Picture=defHDinactive2x;Images/MovieDataTags@2x/defHD-inactive@2x.png;&h21404C40;&h62FA8680;false;0;&h0 Picture=logoactive;Images/MovieDataTags/logo-active.png;&h6264E29D;&h6E81FC20;false;0;&h0 Picture=logoinactive;Images/MovieDataTags/logo-inactive.png;&h4D5A2588;&h6E81FC20;false;0;&h0 Picture=logoactive2x;Images/MovieDataTags@2x/logo-active@2x.png;&h1203789D;&h62FA8680;false;0;&h0 Picture=logoinactive2x;Images/MovieDataTags@2x/logo-inactive@2x.png;&h21E3D64E;&h62FA8680;false;0;&h0 Picture=clearartactive2x;Images/MovieDataTags@2x/clearart-active@2x.png;&h62C9C85A;&h62FA8680;false;0;&h0 Picture=clearartinactive2x;Images/MovieDataTags@2x/clearart-inactive@2x.png;&h2D810107;&h62FA8680;false;0;&h0 Picture=clearartactive;Images/MovieDataTags/clearart-active.png;&h1E254C6F;&h6E81FC20;false;0;&h0 Picture=clearartinactive;Images/MovieDataTags/clearart-inactive.png;&h22BD5C85;&h6E81FC20;false;0;&h0 Picture=ToolUpdate2x;Images/Toolbar Icons/ToolUpdate@2x.png;&h467CC39E;&h1CB3421F;false;0;&h0 Class=SearchList;Classes/SearchList.rbbas;&h480A12D2;&h61F91BC9;false Class=MediaDetails;Classes/MediaDetails.rbbas;&hD59FF97;&h61F91BC9;false Picture=tb_experimental;Images/tb icons/tb_experimental.png;&h1353974E;&h16FC0271;false;0;&h0 Picture=tb_experimental2x;Images/tb icons/tb_experimental@2x.png;&h54F2CD71;&h16FC0271;false;0;&h0 Folder=Movie Section;Windows/Movie Section;&h582E392D;&h5241B183;false Folder=TV Show Section;Windows/TV Show Section;&h4650B3D8;&h5241B183;false Window=wndMovieMetadata;Windows/Movie Section/wndMovieMetadata.rbfrm;&h3EF6DC8E;&h582E392D;false Window=wndSetManager;Windows/Movie Section/wndSetManager.rbfrm;&h837F6DF;&h582E392D;false Folder=Utility;Windows/Utility;&h42AC283B;&h5241B183;false Window=wndMessage;Windows/Utility/wndMessage.rbfrm;&h3F1C5E0C;&h42AC283B;false Window=wndRenameTags;Windows/Utility/wndRenameTags.rbfrm;&h5AD7E270;&h42AC283B;false Window=wndClean;Windows/Utility/wndClean.rbfrm;&h11DB8F1D;&h42AC283B;false Window=wndPreviewThumbs;Windows/Utility/wndPreviewThumbs.rbfrm;&h2E0557B2;&h42AC283B;false Window=wndResults;Windows/Utility/wndResults.rbfrm;&h3C525B;&h42AC283B;false Window=wndSearch;Windows/Utility/wndSearch.rbfrm;&h389F5D97;&h42AC283B;false Class=PushbuttonPro;Classes/PushbuttonPro.rbbas;&h5487E28A;&h61F91BC9;false Module=URLCore;CoreServices/URLCore.rbbas;&h6E7FA88D;&h18E3FCD2;false Picture=miniconmovieII;Images/minicon-movieII.png;&h7FE3A230;&h5510FB7A;false;0;&h0 Picture=miniconmovieII2x;Images/minicon-movieII@2x.png;&h39AD808E;&h5510FB7A;false;0;&h0 Picture=bookmark;Images/bookmark.png;&h8D8CEE3;&h5510FB7A;false;0;&h0 Window=wndStatus;Windows/Utility/wndStatus.rbfrm;&h499CADE5;&h42AC283B;false Module=IMDb;Modules/IMDb.rbbas;&h5CC5625B;&h298F9D05;false Window=wndShowMetadata;Windows/TV Show Section/wndShowMetadata.rbfrm;&h5C4F8F9E;&h4650B3D8;false Window=wndEpisodeManager;Windows/TV Show Section/wndEpisodeManager.rbfrm;&h7A8E33D6;&h4650B3D8;false Window=wndAdvancedSettings;Obsolete/wndAdvancedSettings.rbfrm;&h6C1CC6C9;&h54E45B12;false Picture=tb_episodes;Images/tb icons/tb_episodes.png;&h67D8866F;&h16FC0271;false;0;&h0 Picture=tb_episodes2x;Images/tb icons/tb_episodes@2x.png;&h38625852;&h16FC0271;false;0;&h0 Folder=Status;Images/Status;&h3D93657B;&h5510FB7A;false Picture=status_announced2x;Images/Status/status_announced@2x.png;&h17EBCF78;&h3D93657B;false;0;&h0 Picture=status_bubble2x;Images/Status/status_bubble@2x.png;&h7A821D32;&h3D93657B;false;0;&h0 Picture=status_development2x;Images/Status/status_development@2x.png;&h744B3E19;&h3D93657B;false;0;&h0 Picture=status_ended2x;Images/Status/status_ended@2x.png;&h77DA589A;&h3D93657B;false;0;&h0 Picture=status_final2x;Images/Status/status_final@2x.png;&h1FEF6595;&h3D93657B;false;0;&h0 Picture=status_hiatus2x;Images/Status/status_hiatus@2x.png;&h1DF66B3A;&h3D93657B;false;0;&h0 Picture=status_month2x;Images/Status/status_month@2x.png;&h1CF9FDDA;&h3D93657B;false;0;&h0 Picture=status_newseries2x;Images/Status/status_newseries@2x.png;&h608943B8;&h3D93657B;false;0;&h0 Picture=status_pilot2x;Images/Status/status_pilot@2x.png;&h53BD5831;&h3D93657B;false;0;&h0 Picture=status_today2x;Images/Status/status_today@2x.png;&h33E96590;&h3D93657B;false;0;&h0 Picture=status_unknown2x;Images/Status/status_unknown@2x.png;&h200B2D36;&h3D93657B;false;0;&h0 Picture=status_upcoming2x;Images/Status/status_upcoming@2x.png;&h3DC5864F;&h3D93657B;false;0;&h0 Picture=status_week2x;Images/Status/status_week@2x.png;&h72F50DDD;&h3D93657B;false;0;&h0 Class=HierListBox;Classes/HierListBox.rbbas;&h56AA3EC2;&h61F91BC9;false Picture=Snowman;Images/Snowman.png;&h50A5A331;&h5510FB7A;false;0;&h0 Picture=JackOLantern;Images/JackOLantern.png;&h2A7D50FA;&h5510FB7A;false;0;&h0 Module=HTMLTemplate;Modules/HTMLTemplate.rbbas;&h73F1E5F4;&h298F9D05;false Window=wndHTMLExporter;Windows/Utility/wndHTMLExporter.rbfrm;&h39DF2D0;&h42AC283B;false RawData=credits;Resources/credits.html;&h2C249D77;&h23881057;false Picture=bannerplaceholder;Images/banner-placeholder.png;&h1D15192C;&h5510FB7A;false;0;&h0 Picture=episodethumbplaceholder;Images/episodethumb-placeholder.jpg;&h7BBE102E;&h5510FB7A;false;0;&h0 Picture=themesongactive;Images/MovieDataTags/themesong-active@.png;&h24F6DC64;&h6E81FC20;false;0;&h0 Picture=themesonginactive;Images/MovieDataTags/themesong-inactive@.png;&h4AFF7DD7;&h6E81FC20;false;0;&h0 Picture=themesongactive2x;Images/MovieDataTags@2x/themesong-active@2x.png;&h4B9F165E;&h62FA8680;false;0;&h0 Picture=themesonginactive2x;Images/MovieDataTags@2x/themesong-inactive@2x.png;&h3975DDC1;&h62FA8680;false;0;&h0 Picture=tb_themesongselected;Images/tb icons/tb_themesong-selected.png;&h69320905;&h16FC0271;false;0;&h0 Picture=tb_themesongselected2x;Images/tb icons/tb_themesong-selected@2x.png;&h53EE9EDD;&h16FC0271;false;0;&h0 Picture=tb_themesong;Images/tb icons/tb_themesong.png;&h57002BDD;&h16FC0271;false;0;&h0 Picture=tb_themesong2x;Images/tb icons/tb_themesong@2x.png;&h4C402870;&h16FC0271;false;0;&h0 Module=Encrypted;MBSSerial.rbo;&h2348E93;&h298F9D05;false Picture=unwatched;Images/Status/unwatched.png;&h4D761B7F;&h3D93657B;false;0;&h0 Picture=watched;Images/Status/watched.png;&h507983A;&h3D93657B;false;0;&h0 Window=wndItemChooser;Windows/Utility/wndItemChooser.rbfrm;&h44CFBEE4;&h42AC283B;false Window=dlgInput;Windows/Utility/dlgInput.rbfrm;&h4EEA6A01;&h42AC283B;false Picture=metatagsaudiotruehd;Images/Metatags/metatags-audio-truehd.png;&h181CCA05;&h3C0EB9D;false;0;&h0 Picture=dropdown;Images/dropdown.png;&h7E8563F2;&h5510FB7A;false;0;&h0 Class=Class1;Classes/Class1.rbbas;&h4521C52;&h61F91BC9;false Class=NotificationCenter;Modules/nc/NotificationCenter.rbbas;&h6FE325D0;&h4AA84F20;false Window=wndBugReporter;Windows/Utility/wndBugReporter.rbfrm;&h7079BB95;&h42AC283B;false Folder=Global Methods;Modules/Global Methods;&h2C545099;&h298F9D05;false Module=Globals;Modules/Global Methods/Globals.rbbas;&h3257C1DE;&h2C545099;false Module=PaintBucket;Modules/Global Methods/PaintBucket.rbbas;&h1F79314A;&h2C545099;false Module=PrettyXML;Modules/Global Methods/PrettyXML.rbbas;&h56509CF7;&h2C545099;false Module=LionFullScreen;Modules/Global Methods/LionFullScreen.rbbas;&h7656292;&h2C545099;false Picture=hdtvactive;Images/MovieDataTags/hdtv-active.png;&h4426BEB0;&h6E81FC20;false;0;&h0 Picture=hdtvinactive;Images/MovieDataTags/hdtv-inactive.png;&h4BB1796A;&h6E81FC20;false;0;&h0 Picture=hdtvactive2x;Images/MovieDataTags@2x/hdtv-active@2x.png;&h709A869E;&h62FA8680;false;0;&h0 Picture=hdtvinactive2x;Images/MovieDataTags@2x/hdtv-inactive@2x.png;&h30FC6A79;&h62FA8680;false;0;&h0 Module=AppearanceManager;Modules/macoslib/AppearanceManager.rbbas;&h71493042;&h3CAB55D;false Module=AppleEvents;Modules/macoslib/AppleEvents.rbbas;&h7BFFB8CE;&h3CAB55D;false Module=ATSForFonts;Modules/macoslib/ATSForFonts/ATSForFonts.rbbas;&h51BE5DA1;&h3CAB55D;false Module=CertTools;Modules/macoslib/CertTools.rbbas;&h28F5609A;&h3CAB55D;false Module=Cocoa;Modules/macoslib/Cocoa/Cocoa.rbbas;&h599751E;&h3CAB55D;false Folder=Cocoa Extensions;Modules/macoslib/Cocoa Extensions;&h1DD84917;&h3CAB55D;false Folder=Cocoa MenuItems;Modules/macoslib/Cocoa MenuItems;&h62A6D5F5;&h3CAB55D;false Folder=Cocoa Notifications;Modules/macoslib/Cocoa Notifications;&h37293C12;&h3CAB55D;false Module=CocoaToolbar;Modules/macoslib/CocoaToolbar/CocoaToolbar.rbbas;&h74271FAE;&h3CAB55D;false Module=ControlManager;Modules/macoslib/ControlManager.rbbas;&h349155BB;&h3CAB55D;false Module=Carbon;Modules/macoslib/Carbon/Carbon.rbbas;&h3193C499;&h3CAB55D;false Module=CarbonEvents;Modules/macoslib/CarbonEvents.rbbas;&h5C5073E2;&h3CAB55D;false Folder=Controls;Modules/macoslib/Controls;&h25E86B6D;&h3CAB55D;false Module=CFArrayExtension;Modules/macoslib/CFArrayExtension.rbbas;&h3DE51632;&h3CAB55D;false Module=CoreFoundation;Modules/macoslib/CoreFoundation/CoreFoundation.rbbas;&hB148E03;&h3CAB55D;false Module=CoreGraphics;Modules/macoslib/CoreGraphics/CoreGraphics.rbbas;&h7277AE49;&h3CAB55D;false Module=CoreText;Modules/macoslib/CoreText/CoreText.rbbas;&hF53B6FB;&h3CAB55D;false Module=FileManager;Modules/macoslib/FileManager/FileManager.rbbas;&h4112623F;&h3CAB55D;false Module=FolderManager;Modules/macoslib/FolderManager.rbbas;&h1DF0791F;&h3CAB55D;false Class=FourCharCode;Modules/macoslib/FourCharCode.rbbas;&h16A0333A;&h3CAB55D;false Module=IOKit;Modules/macoslib/IOKit/IOKit.rbbas;&h6F837216;&h3CAB55D;false Module=KeychainServices;Modules/macoslib/KeychainServices/KeychainServices.rbbas;&h1EB77D32;&h3CAB55D;false Module=LaunchServices;Modules/macoslib/LaunchServices.rbbas;&h207CAF05;&h3CAB55D;false Folder=MacIcon Classes;Modules/macoslib/MacIcon Classes;&h59C6C392;&h3CAB55D;false Class=MacOSError;Modules/macoslib/MacOSError.rbbas;&h85215F0;&h3CAB55D;false Module=NavigationServices;Modules/macoslib/NavigationServices/NavigationServices.rbbas;&h451E857A;&h3CAB55D;false Module=ProcessManager;Modules/macoslib/ProcessManager/ProcessManager.rbbas;&h56CD71AF;&h3CAB55D;false Module=QTKit;Modules/macoslib/QTKit/QTKit.rbbas;&h49E30654;&h3CAB55D;false Module=Spotlight;Modules/macoslib/Spotlight/Spotlight.rbbas;&h57B4DC57;&h3CAB55D;false Module=SystemConfiguration;Modules/macoslib/SystemConfiguration/SystemConfiguration.rbbas;&h22EE4263;&h3CAB55D;false Module=WindowManager;Modules/macoslib/WindowManager/WindowManager.rbbas;&h4848C525;&h3CAB55D;false Class=Tuple;Modules/macoslib/Tuple.rbbas;&h218766DC;&h3CAB55D;false Class=UTI;Modules/macoslib/UTI.rbbas;&h4072485C;&h3CAB55D;false Class=MacTCPSocket;Modules/macoslib/MacTCPSocket.rbbas;&hEECF2B8;&h3CAB55D;false Folder=Convenience extensions and objects;Modules/macoslib/Convenience extensions and objects;&h66335755;&h3CAB55D;false Module=AttachedPropertiesModule;Modules/macoslib/AttachedPropertiesModule.rbbas;&h34AB0384;&h3CAB55D;false Class=ATSFont;Modules/macoslib/ATSForFonts/ATSFont.rbbas;&h47742BC5;&h51BE5DA1;false Class=ATSFontFamily;Modules/macoslib/ATSForFonts/ATSFontFamily.rbbas;&h1BE5F8CF;&h51BE5DA1;false Class=AutoreleaseTimer;Modules/macoslib/Cocoa/AutoreleaseTimer.rbbas;&h17322DFE;&h599751E;false Class=CIContext;Modules/macoslib/Cocoa/CIContext.rbbas;&h5F69CC3D;&h599751E;false Class=CIImage;Modules/macoslib/Cocoa/CIImage.rbbas;&h1AE02B61;&h599751E;false Class=CocoaDelegate;Modules/macoslib/Cocoa/CocoaDelegate.rbbas;&h73403CB5;&h599751E;false Class=CocoaUnregisteredClassException;Modules/macoslib/Cocoa/CocoaUnregisteredClassException.rbbas;&h7E520BD5;&h599751E;false Class=CocoaUnregisteredSelectorException;Modules/macoslib/Cocoa/CocoaUnregisteredSelectorException.rbbas;&h3C874F63;&h599751E;false Class=NSActionCell;Modules/macoslib/Cocoa/NSActionCell.rbbas;&h576D4D46;&h599751E;false Class=NSAffineTransform;Modules/macoslib/Cocoa/NSAffineTransform.rbbas;&h48EC9D27;&h599751E;false Class=NSApplication;Modules/macoslib/Cocoa/NSApplication.rbbas;&h2641D27E;&h599751E;false Class=NSArray;Modules/macoslib/Cocoa/NSArray.rbbas;&h2B62A377;&h599751E;false Class=NSAttributedString;Modules/macoslib/Cocoa/NSAttributedString.rbbas;&h58DA3187;&h599751E;false Class=NSAutoreleasePool;Modules/macoslib/Cocoa/NSAutoreleasePool.rbbas;&h5CEA0549;&h599751E;false Class=NSBezierPath;Modules/macoslib/Cocoa/NSBezierPath.rbbas;&h8016CED;&h599751E;false Class=NSBitmapImageRep;Modules/macoslib/Cocoa/NSBitmapImageRep.rbbas;&h1596815C;&h599751E;false Class=NSBundle;Modules/macoslib/Cocoa/NSBundle.rbbas;&h4C070BBC;&h599751E;false Class=NSButtonCell;Modules/macoslib/Cocoa/NSButtonCell.rbbas;&h6293CC48;&h599751E;false Class=NSCalendar;Modules/macoslib/Cocoa/NSCalendar.rbbas;&h5548FF2D;&h599751E;false Class=NSCell;Modules/macoslib/Cocoa/NSCell.rbbas;&h2B6950BF;&h599751E;false Class=NSCharacterSet;Modules/macoslib/Cocoa/NSCharacterSet.rbbas;&hF348383;&h599751E;false Class=NSColor;Modules/macoslib/Cocoa/NSColor.rbbas;&h40A656E7;&h599751E;false Class=NSColorspace;Modules/macoslib/Cocoa/NSColorspace.rbbas;&h6893BA7F;&h599751E;false Class=NSColorWell;Modules/macoslib/Cocoa/NSColorWell.rbbas;&h3AB95F22;&h599751E;false Class=NSConnection;Modules/macoslib/Cocoa/NSConnection.rbbas;&h601510F2;&h599751E;false Class=NSControl;Modules/macoslib/Cocoa/NSControl.rbbas;&h70BF2CC;&h599751E;false Class=NSCountedSet;Modules/macoslib/Cocoa/NSCountedSet.rbbas;&h21717457;&h599751E;false Class=NSData;Modules/macoslib/Cocoa/NSData.rbbas;&h1F8D4E8E;&h599751E;false Class=NSDate;Modules/macoslib/Cocoa/NSDate.rbbas;&h76209E76;&h599751E;false Class=NSDateComponents;Modules/macoslib/Cocoa/NSDateComponents.rbbas;&h5783D336;&h599751E;false Class=NSDateFormatter;Modules/macoslib/Cocoa/NSDateFormatter.rbbas;&hF9FECC3;&h599751E;false Class=NSDatePicker;Modules/macoslib/Cocoa/NSDatePicker.rbbas;&h4C713FDE;&h599751E;false Class=NSDictionary;Modules/macoslib/Cocoa/NSDictionary.rbbas;&h1F1870AD;&h599751E;false Class=NSDistributedNotificationCenter;Modules/macoslib/Cocoa/NSDistributedNotificationCenter.rbbas;&h7D8DBF73;&h599751E;false Class=NSDockTile;Modules/macoslib/Cocoa/NSDockTile.rbbas;&h65149910;&h599751E;false Class=NSDocument;Modules/macoslib/Cocoa/NSDocument.rbbas;&h2B4D5EEE;&h599751E;false Class=NSDrawer;Modules/macoslib/Cocoa/NSDrawer.rbbas;&h6493B31D;&h599751E;false Class=NSEnumerator;Modules/macoslib/Cocoa/NSEnumerator.rbbas;&h1CD4AA27;&h599751E;false Class=NSError;Modules/macoslib/Cocoa/NSError.rbbas;&h4DEF36E0;&h599751E;false Class=NSEvent;Modules/macoslib/Cocoa/NSEvent.rbbas;&h13FC15BF;&h599751E;false Class=NSException;Modules/macoslib/Cocoa/NSException.rbbas;&hAF7FA7F;&h599751E;false Class=NSFileWrapper;Modules/macoslib/Cocoa/NSFileWrapper.rbbas;&h1E5EEF1F;&h599751E;false Class=NSFont;Modules/macoslib/Cocoa/NSFont.rbbas;&h6AA52D72;&h599751E;false Class=NSFontDescriptor;Modules/macoslib/Cocoa/NSFontDescriptor.rbbas;&h24B0FB7;&h599751E;false Class=NSFontManager;Modules/macoslib/Cocoa/NSFontManager.rbbas;&hDF4FA34;&h599751E;false Class=NSGraphicsContext;Modules/macoslib/Cocoa/NSGraphicsContext.rbbas;&h4E56B4BA;&h599751E;false Class=NSHost;Modules/macoslib/Cocoa/NSHost.rbbas;&h1E73892A;&h599751E;false Class=NSImage;Modules/macoslib/Cocoa/NSImage.rbbas;&h333275AA;&h599751E;false Class=NSImageRep;Modules/macoslib/Cocoa/NSImageRep.rbbas;&h35CB47CE;&h599751E;false Class=NSIndexSet;Modules/macoslib/Cocoa/NSIndexSet.rbbas;&h34D7829F;&h599751E;false Class=NSLayoutConstraint;Modules/macoslib/Cocoa/NSLayoutConstraint.rbbas;&h30C0F179;&h599751E;false Class=NSLayoutManager;Modules/macoslib/Cocoa/NSLayoutManager.rbbas;&h4B2D9996;&h599751E;false Class=NSLevelIndicator;Modules/macoslib/Cocoa/NSLevelIndicator.rbbas;&h1EBEAF0F;&h599751E;false Class=NSLocale;Modules/macoslib/Cocoa/NSLocale.rbbas;&h78D75333;&h599751E;false Class=NSMenu;Modules/macoslib/Cocoa/NSMenu.rbbas;&h97B8E6;&h599751E;false Class=NSMenuItem;Modules/macoslib/Cocoa/NSMenuItem.rbbas;&h68EC45FD;&h599751E;false Class=NSMutableArray;Modules/macoslib/Cocoa/NSMutableArray.rbbas;&h6FE75C81;&h599751E;false Class=NSMutableCharacterSet;Modules/macoslib/Cocoa/NSMutableCharacterSet.rbbas;&h3E6A9432;&h599751E;false Class=NSMutableData;Modules/macoslib/Cocoa/NSMutableData.rbbas;&h4727C047;&h599751E;false Class=NSMutableDictionary;Modules/macoslib/Cocoa/NSMutableDictionary.rbbas;&h2C0DB76;&h599751E;false Class=NSMutableIndexSet;Modules/macoslib/Cocoa/NSMutableIndexSet.rbbas;&h43886309;&h599751E;false Class=NSMutableSet;Modules/macoslib/Cocoa/NSMutableSet.rbbas;&h2F1E4828;&h599751E;false Class=NSMutableString;Modules/macoslib/Cocoa/NSMutableString.rbbas;&h6D1393E8;&h599751E;false Class=NSNotification;Modules/macoslib/Cocoa/NSNotification.rbbas;&h2053DDF0;&h599751E;false Class=NSNotificationCenter;Modules/macoslib/Cocoa/NSNotificationCenter.rbbas;&h621009CA;&h599751E;false Class=NSNull;Modules/macoslib/Cocoa/NSNull.rbbas;&hAF320B8;&h599751E;false Class=NSNumber;Modules/macoslib/Cocoa/NSNumber.rbbas;&h5FE9574B;&h599751E;false Class=NSObject;Modules/macoslib/Cocoa/NSObject.rbbas;&h50626FC4;&h599751E;false Class=NSObjectRBWrapper;Modules/macoslib/Cocoa/NSObjectRBWrapper.rbbas;&h6E9817BC;&h599751E;false Class=NSPasteboard;Modules/macoslib/Cocoa/NSPasteboard.rbbas;&h433EB203;&h599751E;false Class=NSPasteboardItem;Modules/macoslib/Cocoa/NSPasteboardItem.rbbas;&h49194718;&h599751E;false Class=NSPathComponentCell;Modules/macoslib/Cocoa/NSPathComponentCell.rbbas;&h1A8ADFCC;&h599751E;false Class=NSPathControl;Modules/macoslib/Cocoa/NSPathControl.rbbas;&h136B1957;&h599751E;false Class=NSPopupButton;Modules/macoslib/Cocoa/NSPopupButton.rbbas;&h5C4CEA5C;&h599751E;false Class=NSPort;Modules/macoslib/Cocoa/NSPort.rbbas;&h3DAEAF01;&h599751E;false Class=NSPredicate;Modules/macoslib/Cocoa/NSPredicate.rbbas;&h1763CBF0;&h599751E;false Class=NSPrinter;Modules/macoslib/Cocoa/NSPrinter.rbbas;&h18E24735;&h599751E;false Class=NSRunLoop;Modules/macoslib/Cocoa/NSRunLoop.rbbas;&h2FB136FC;&h599751E;false Class=NSProcessInfo;Modules/macoslib/Cocoa/NSProcessInfo.rbbas;&h1B913480;&h599751E;false Class=NSSearchField;Modules/macoslib/Cocoa/NSSearchField.rbbas;&h5A0E0F49;&h599751E;false Class=NSSlider;Modules/macoslib/Cocoa/NSSlider.rbbas;&h510DF175;&h599751E;false Class=NSStatusBar;Modules/macoslib/Cocoa/NSStatusBar.rbbas;&h6A67A38B;&h599751E;false Class=NSStatusItem;Modules/macoslib/Cocoa/NSStatusItem.rbbas;&h3A2272E6;&h599751E;false Class=NSStepper;Modules/macoslib/Cocoa/NSStepper.rbbas;&h2BA5B981;&h599751E;false Class=NSString;Modules/macoslib/Cocoa/NSString.rbbas;&hD361C30;&h599751E;false Class=NSResponder;Modules/macoslib/Cocoa/NSResponder.rbbas;&h5B74DBBC;&h599751E;false Class=NSRunningApplication;Modules/macoslib/Cocoa/NSRunningApplication.rbbas;&h55068432;&h599751E;false Class=NSScreen;Modules/macoslib/Cocoa/NSScreen.rbbas;&h1ED15BE0;&h599751E;false Class=NSSet;Modules/macoslib/Cocoa/NSSet.rbbas;&h42E72094;&h599751E;false Class=NSTableColumn;Modules/macoslib/Cocoa/NSTableColumn.rbbas;&h540C3882;&h599751E;false Class=NSTableHeaderView;Modules/macoslib/Cocoa/NSTableHeaderView.rbbas;&h6E524B8F;&h599751E;false Class=NSTableView;Modules/macoslib/Cocoa/NSTableView.rbbas;&h5CDF1384;&h599751E;false Class=NSTableViewDataSource;Modules/macoslib/Cocoa/NSTableViewDataSource.rbbas;&h397AB064;&h599751E;false Class=NSText;Modules/macoslib/Cocoa/NSText.rbbas;&h25D2D45D;&h599751E;false Class=NSTextAttachment;Modules/macoslib/Cocoa/NSTextAttachment.rbbas;&h34747AB7;&h599751E;false Class=NSTextBlock;Modules/macoslib/Cocoa/NSTextBlock.rbbas;&h4B24E0EE;&h599751E;false Class=NSTextContainer;Modules/macoslib/Cocoa/NSTextContainer.rbbas;&h622B9172;&h599751E;false Class=NSTextList;Modules/macoslib/Cocoa/NSTextList.rbbas;&h1A5A475E;&h599751E;false Class=NSTextTable;Modules/macoslib/Cocoa/NSTextTable.rbbas;&h1D03BB7C;&h599751E;false Class=NSTextTableBlock;Modules/macoslib/Cocoa/NSTextTableBlock.rbbas;&h600A1A6B;&h599751E;false Class=NSTimer;Modules/macoslib/Cocoa/NSTimer.rbbas;&h374CD9B5;&h599751E;false Class=NSTimeZone;Modules/macoslib/Cocoa/NSTimeZone.rbbas;&h16695816;&h599751E;false Class=NSTokenField;Modules/macoslib/Cocoa/NSTokenField.rbbas;&h5E16597E;&h599751E;false Class=NSURL;Modules/macoslib/Cocoa/NSURL.rbbas;&hD4DD11A;&h599751E;false Class=NSValue;Modules/macoslib/Cocoa/NSValue.rbbas;&h6FDB4A6E;&h599751E;false Class=NSView;Modules/macoslib/Cocoa/NSView.rbbas;&h25F3F6C7;&h599751E;false Class=NSWindow;Modules/macoslib/Cocoa/NSWindow.rbbas;&h33CED7EE;&h599751E;false Class=NSWorkspace;Modules/macoslib/Cocoa/NSWorkspace.rbbas;&h50C2A67A;&h599751E;false Interface=VariantValueInterface;Modules/macoslib/Cocoa/VariantValueInterface.rbbas;&h1B3FFEA8;&h599751E;false Interface=NSPasteboardWriting;Modules/macoslib/Cocoa/NSPasteboardWriting.rbbas;&h6681738;&h599751E;false Module=ComboBoxExtension;Modules/macoslib/Cocoa Extensions/ComboBoxExtension.rbbas;&h1BCCA277;&h1DD84917;false Module=ControlExtension;Modules/macoslib/Cocoa Extensions/ControlExtension.rbbas;&h17BE8289;&h1DD84917;false Module=GroupBoxExtensions;Modules/macoslib/Cocoa Extensions/GroupBoxExtensions.rbbas;&h5C6C3E32;&h1DD84917;false Module=HTMLViewerExtension;Modules/macoslib/Cocoa Extensions/HTMLViewerExtension.rbbas;&h4667B5AB;&h1DD84917;false Module=PopupMenuExtension;Modules/macoslib/Cocoa Extensions/PopupMenuExtension.rbbas;&h42C8534F;&h1DD84917;false Module=ProgressBarExtension;Modules/macoslib/Cocoa Extensions/ProgressBarExtension.rbbas;&h6DD5CB6F;&h1DD84917;false Module=ProgressWheelExtension;Modules/macoslib/Cocoa Extensions/ProgressWheelExtension.rbbas;&h6F1F5E64;&h1DD84917;false Module=PushButtonExtension;Modules/macoslib/Cocoa Extensions/PushButtonExtension.rbbas;&h746E71E0;&h1DD84917;false Module=SegmentedControlExtension;Modules/macoslib/Cocoa Extensions/SegmentedControlExtension.rbbas;&h7EF6A67D;&h1DD84917;false Module=SliderExtension;Modules/macoslib/Cocoa Extensions/SliderExtension.rbbas;&h732CDB4F;&h1DD84917;false Module=TabPanelExtension;Modules/macoslib/Cocoa Extensions/TabPanelExtension.rbbas;&h5F29C42;&h1DD84917;false Module=TextAreaExtension;Modules/macoslib/Cocoa Extensions/TextAreaExtension.rbbas;&h7AF0F5C0;&h1DD84917;false Module=TextFieldExtension;Modules/macoslib/Cocoa Extensions/TextFieldExtension.rbbas;&h619690F4;&h1DD84917;false Class=CocoaMenuItem;Modules/macoslib/Cocoa MenuItems/CocoaMenuItem.rbbas;&h6406F6DF;&h62A6D5F5;false Class=CocoaMenuItemSupermenu;Modules/macoslib/Cocoa MenuItems/CocoaMenuItemSupermenu.rbbas;&h53A1F6D;&h62A6D5F5;false Class=CocoaMenuItemToggle;Modules/macoslib/Cocoa MenuItems/CocoaMenuItemToggle.rbbas;&h2AE5716F;&h62A6D5F5;false Folder=File Menu;Modules/macoslib/Cocoa MenuItems/File Menu;&h3D7A860F;&h62A6D5F5;false Folder=Edit Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu;&h36F7A3F7;&h62A6D5F5;false Folder=Format Menu;Modules/macoslib/Cocoa MenuItems/Format Menu;&h3C2E0AF8;&h62A6D5F5;false Folder=View Menu;Modules/macoslib/Cocoa MenuItems/View Menu;&h72D2804B;&h62A6D5F5;false Folder=Window Menu;Modules/macoslib/Cocoa MenuItems/Window Menu;&h59E53877;&h62A6D5F5;false Class=NSNotificationObserver;Modules/macoslib/Cocoa Notifications/NSNotificationObserver.rbbas;&h57DE7C62;&h37293C12;false Interface=NSNotificationInterface;Modules/macoslib/Cocoa Notifications/NSNotificationInterface.rbbas;&h4FB874A5;&h37293C12;false Class=NSApplicationNotificationObserver;Modules/macoslib/Cocoa Notifications/NSApplicationNotificationObserver.rbbas;&h56F2672C;&h37293C12;false Interface=NSApplicationNotificationInterface;Modules/macoslib/Cocoa Notifications/NSApplicationNotificationInterface.rbbas;&h4453E7F2;&h37293C12;false Class=NSTimeZoneNotificationObserver;Modules/macoslib/Cocoa Notifications/NSTimeZoneNotificationObserver.rbbas;&h60A1258F;&h37293C12;false Interface=NSTimeZoneNotificationInterface;Modules/macoslib/Cocoa Notifications/NSTimeZoneNotificationInterface.rbbas;&h73A9427E;&h37293C12;false Class=NSWindowNotificationObserver;Modules/macoslib/Cocoa Notifications/NSWindowNotificationObserver.rbbas;&h6D4CDB2A;&h37293C12;false Interface=NSWindowNotificationInterface;Modules/macoslib/Cocoa Notifications/NSWindowNotificationInterface.rbbas;&h50C91C1B;&h37293C12;false Class=NSWorkspaceNotificationObserver;Modules/macoslib/Cocoa Notifications/NSWorkspaceNotificationObserver.rbbas;&h43549BB2;&h37293C12;false Interface=NSWorkspaceNotificationInterface;Modules/macoslib/Cocoa Notifications/NSWorkspaceNotificationInterface.rbbas;&h67BA274C;&h37293C12;false Class=NSDistributedNotificationsObserver;Modules/macoslib/Cocoa Notifications/NSDistributedNotificationsObserver.rbbas;&h6E6A656D;&h37293C12;false Interface=NSDistributedNotificationsInterface;Modules/macoslib/Cocoa Notifications/NSDistributedNotificationsInterface.rbbas;&hB295163;&h37293C12;false Class=NSToolbar;Modules/macoslib/CocoaToolbar/NSToolbar.rbbas;&h459E81F4;&h74271FAE;false Class=NSToolbarItem;Modules/macoslib/CocoaToolbar/NSToolbarItem.rbbas;&h29661F87;&h74271FAE;false Interface=NSToolbarItemInterface;Modules/macoslib/CocoaToolbar/NSToolbarItemInterface.rbbas;&h6FA02EF2;&h74271FAE;false Class=NSToolbarButtonItem;Modules/macoslib/CocoaToolbar/NSToolbarButtonItem.rbbas;&h7D6A8CC4;&h74271FAE;false Class=NSToolbarCustomItem;Modules/macoslib/CocoaToolbar/NSToolbarCustomItem.rbbas;&h5E4019D5;&h74271FAE;false Class=NSToolbarDropMenuItem;Modules/macoslib/CocoaToolbar/NSToolbarDropMenuItem.rbbas;&h426060F0;&h74271FAE;false Class=CarbonPasteboard;Modules/macoslib/Carbon/CarbonPasteboard.rbbas;&h457C9041;&h3193C499;false Class=MacCheckbox;Modules/macoslib/Controls/MacCheckbox.rbbas;&h74E300B0;&h25E86B6D;false Class=MacDatePicker;Modules/macoslib/Controls/MacDatePicker.rbbas;&h6342A069;&h25E86B6D;false Class=HISearchField;Modules/macoslib/Controls/HISearchField.rbbas;&h2B31C20E;&h25E86B6D;false Class=MacMenu;Modules/macoslib/Controls/MacMenu.rbbas;&h4FBB7CEF;&h25E86B6D;false Class=CFArray;Modules/macoslib/CoreFoundation/CFArray.rbbas;&h1E079974;&hB148E03;false Class=CFBoolean;Modules/macoslib/CoreFoundation/CFBoolean.rbbas;&h4EBDFB9;&hB148E03;false Class=CFBundle;Modules/macoslib/CoreFoundation/CFBundle.rbbas;&h19AD2EDB;&hB148E03;false Class=CFCalendar;Modules/macoslib/CoreFoundation/CFCalendar.rbbas;&h38DF7AAE;&hB148E03;false Class=CFCharacterSet;Modules/macoslib/CoreFoundation/CFCharacterSet.rbbas;&h57EF9453;&hB148E03;false Class=CFData;Modules/macoslib/CoreFoundation/CFData.rbbas;&h31F343E5;&hB148E03;false Class=CFDate;Modules/macoslib/CoreFoundation/CFDate.rbbas;&h59EECAA7;&hB148E03;false Class=CFError;Modules/macoslib/CoreFoundation/CFError.rbbas;&h4C3B09B7;&hB148E03;false Class=CFDictionary;Modules/macoslib/CoreFoundation/CFDictionary.rbbas;&h37FB3620;&hB148E03;false Class=CFMutableArray;Modules/macoslib/CoreFoundation/CFMutableArray.rbbas;&h4D9ECD3C;&hB148E03;false Class=CFMutableData;Modules/macoslib/CoreFoundation/CFMutableData.rbbas;&h74B48799;&hB148E03;false Class=CFMutableDictionary;Modules/macoslib/CoreFoundation/CFMutableDictionary.rbbas;&h7832CB50;&hB148E03;false Class=CFMutableSet;Modules/macoslib/CoreFoundation/CFMutableSet.rbbas;&h4EC2707C;&hB148E03;false Class=CFMutableString;Modules/macoslib/CoreFoundation/CFMutableString.rbbas;&h3F6746EF;&hB148E03;false Class=CFNotificationCenter;Modules/macoslib/CoreFoundation/CFNotificationCenter.rbbas;&h15625714;&hB148E03;false Class=CFLocale;Modules/macoslib/CoreFoundation/CFLocale.rbbas;&h6B432EA9;&hB148E03;false Class=CFNumber;Modules/macoslib/CoreFoundation/CFNumber.rbbas;&h7ACD1E9;&hB148E03;false Class=CFNull;Modules/macoslib/CoreFoundation/CFNull.rbbas;&h63095D94;&hB148E03;false Class=CFPreferences;Modules/macoslib/CoreFoundation/CFPreferences.rbbas;&h7BDF13FD;&hB148E03;false Class=CFReadStream;Modules/macoslib/CoreFoundation/CFReadStream.rbbas;&h7299C839;&hB148E03;false Class=CFRunLoop;Modules/macoslib/CoreFoundation/CFRunLoop.rbbas;&h4E28929C;&hB148E03;false Class=CFRunLoopSource;Modules/macoslib/CoreFoundation/CFRunLoopSource.rbbas;&h49B1A980;&hB148E03;false Class=CFRunLoopTimer;Modules/macoslib/CoreFoundation/CFRunLoopTimer.rbbas;&h2EEF79F2;&hB148E03;false Class=CFSet;Modules/macoslib/CoreFoundation/CFSet.rbbas;&h6C2F5896;&hB148E03;false Class=CFSocket;Modules/macoslib/CoreFoundation/CFSocket.rbbas;&h186158FD;&hB148E03;false Class=CFSocketSignature;Modules/macoslib/CoreFoundation/CFSocketSignature.rbbas;&h1F199832;&hB148E03;false Class=CFStream;Modules/macoslib/CoreFoundation/CFStream.rbbas;&h49574C37;&hB148E03;false Class=CFString;Modules/macoslib/CoreFoundation/CFString.rbbas;&h24D1625;&hB148E03;false Class=CFStringTokenizer;Modules/macoslib/CoreFoundation/CFStringTokenizer.rbbas;&h12E919F7;&hB148E03;false Class=CFTimeZone;Modules/macoslib/CoreFoundation/CFTimeZone.rbbas;&h5A7F27A;&hB148E03;false Class=CFType;Modules/macoslib/CoreFoundation/CFType.rbbas;&h55206C22;&hB148E03;false Class=CFURL;Modules/macoslib/CoreFoundation/CFURL.rbbas;&h439B997D;&hB148E03;false Class=CFWriteStream;Modules/macoslib/CoreFoundation/CFWriteStream.rbbas;&h1C7A41DE;&hB148E03;false Interface=CFPropertyList;Modules/macoslib/CoreFoundation/CFPropertyList.rbbas;&h1E7AA613;&hB148E03;false Class=CGBitmapContext;Modules/macoslib/CoreGraphics/CGBitmapContext.rbbas;&h62D7AAD;&h7277AE49;false Class=CGContext;Modules/macoslib/CoreGraphics/CGContext.rbbas;&h13D138AC;&h7277AE49;false Class=CGContextGraphicsPort;Modules/macoslib/CoreGraphics/CGContextGraphicsPort.rbbas;&hCDFF004;&h7277AE49;false Class=CGColorSpace;Modules/macoslib/CoreGraphics/CGColorSpace.rbbas;&h4206DEDC;&h7277AE49;false Class=CGColor;Modules/macoslib/CoreGraphics/CGColor.rbbas;&h5111A107;&h7277AE49;false Class=CGDataConsumer;Modules/macoslib/CoreGraphics/CGDataConsumer.rbbas;&h5C633DCB;&h7277AE49;false Class=CGDataProvider;Modules/macoslib/CoreGraphics/CGDataProvider.rbbas;&h776E4B75;&h7277AE49;false Class=CGFont;Modules/macoslib/CoreGraphics/CGFont.rbbas;&h6A1C6D3A;&h7277AE49;false Class=CGFunction;Modules/macoslib/CoreGraphics/CGFunction.rbbas;&h704772E8;&h7277AE49;false Class=CGImage;Modules/macoslib/CoreGraphics/CGImage.rbbas;&h62C95894;&h7277AE49;false Class=CGImageDestination;Modules/macoslib/CoreGraphics/CGImageDestination.rbbas;&h10D6D0DD;&h7277AE49;false Class=CGImageSource;Modules/macoslib/CoreGraphics/CGImageSource.rbbas;&h72AA774;&h7277AE49;false Class=CGMutablePath;Modules/macoslib/CoreGraphics/CGMutablePath.rbbas;&h157F5FF;&h7277AE49;false Class=CGPath;Modules/macoslib/CoreGraphics/CGPath.rbbas;&h35D77AAF;&h7277AE49;false Class=CGPattern;Modules/macoslib/CoreGraphics/CGPattern.rbbas;&h55B7D46C;&h7277AE49;false Class=CGPDFArray;Modules/macoslib/CoreGraphics/CGPDFArray.rbbas;&h17DB6C11;&h7277AE49;false Class=CGPDFBoolean;Modules/macoslib/CoreGraphics/CGPDFBoolean.rbbas;&h46941DF9;&h7277AE49;false Class=CGPDFDictionary;Modules/macoslib/CoreGraphics/CGPDFDictionary.rbbas;&h263C2C48;&h7277AE49;false Class=CGPDFDocument;Modules/macoslib/CoreGraphics/CGPDFDocument.rbbas;&h387F803A;&h7277AE49;false Class=CGPDFObject;Modules/macoslib/CoreGraphics/CGPDFObject.rbbas;&h3ABBBE76;&h7277AE49;false Class=CGPDFStream;Modules/macoslib/CoreGraphics/CGPDFStream.rbbas;&h7BD594BF;&h7277AE49;false Class=CGPDFPage;Modules/macoslib/CoreGraphics/CGPDFPage.rbbas;&h31908C3;&h7277AE49;false Class=CGShading;Modules/macoslib/CoreGraphics/CGShading.rbbas;&h608E7D71;&h7277AE49;false Class=CTFont;Modules/macoslib/CoreText/CTFont.rbbas;&h2ACDF8E3;&hF53B6FB;false Class=FSIterator;Modules/macoslib/FileManager/FSIterator.rbbas;&h388F56AF;&h4112623F;false Class=FSRef;Modules/macoslib/FileManager/FSRef.rbbas;&h4A8459D1;&h4112623F;false Class=ExternalPowerAdapter;Modules/macoslib/IOKit/ExternalPowerAdapter.rbbas;&h37251035;&h6F837216;false Class=PowerSource;Modules/macoslib/IOKit/PowerSource.rbbas;&h624B6581;&h6F837216;false Class=Keychain;Modules/macoslib/KeychainServices/Keychain.rbbas;&h43F56C37;&h1EB77D32;false Class=KeychainItem;Modules/macoslib/KeychainServices/KeychainItem.rbbas;&h2593F362;&h1EB77D32;false Class=Error;Modules/macoslib/KeychainServices/Error.rbbas;&h144FFBDA;&h1EB77D32;false Class=MacIcon;Modules/macoslib/MacIcon Classes/MacIcon.rbbas;&hF1FF147;&h59C6C392;false Class=NavigationDialog;Modules/macoslib/NavigationServices/NavigationDialog.rbbas;&h7A19B5B8;&h451E857A;false Class=AskDiscardChangesDialog;Modules/macoslib/NavigationServices/AskDiscardChangesDialog.rbbas;&h2DE9C34E;&h451E857A;false Class=AskReviewDocumentsDialog;Modules/macoslib/NavigationServices/AskReviewDocumentsDialog.rbbas;&h4E158F14;&h451E857A;false Class=AskSaveChangesDialog;Modules/macoslib/NavigationServices/AskSaveChangesDialog.rbbas;&h6964D3BE;&h451E857A;false Class=ChooseFileDialog;Modules/macoslib/NavigationServices/ChooseFileDialog.rbbas;&h5A89D6A6;&h451E857A;false Class=ChooseFolderDialog;Modules/macoslib/NavigationServices/ChooseFolderDialog.rbbas;&hF6B9C60;&h451E857A;false Class=CreateNewFolderDialog;Modules/macoslib/NavigationServices/CreateNewFolderDialog.rbbas;&h61E7AC2E;&h451E857A;false Class=ChooseObjectDialog;Modules/macoslib/NavigationServices/ChooseObjectDialog.rbbas;&h30D973DF;&h451E857A;false Class=ChooseVolumeDialog;Modules/macoslib/NavigationServices/ChooseVolumeDialog.rbbas;&h1446902D;&h451E857A;false Class=ControlKind;Modules/macoslib/NavigationServices/ControlKind.rbbas;&h24A3C667;&h451E857A;false Class=GetFileDialog;Modules/macoslib/NavigationServices/GetFileDialog.rbbas;&h7C36E8A1;&h451E857A;false Class=PutFileDialog;Modules/macoslib/NavigationServices/PutFileDialog.rbbas;&h78E32362;&h451E857A;false Class=NavDialogCreationOptions;Modules/macoslib/NavigationServices/NavDialogCreationOptions.rbbas;&h8287695;&h451E857A;false Class=Process;Modules/macoslib/ProcessManager/Process.rbbas;&h18817608;&h56CD71AF;false Class=QTCaptureConnection;Modules/macoslib/QTKit/QTCaptureConnection.rbbas;&h5B6C556F;&h49E30654;false Class=QTCaptureDevice;Modules/macoslib/QTKit/QTCaptureDevice.rbbas;&h255D5AF3;&h49E30654;false Class=QTCaptureDeviceInput;Modules/macoslib/QTKit/QTCaptureDeviceInput.rbbas;&h13FE5C55;&h49E30654;false Class=QTCaptureSession;Modules/macoslib/QTKit/QTCaptureSession.rbbas;&h20601C5A;&h49E30654;false Class=QTCaptureView;Modules/macoslib/QTKit/QTCaptureView.rbbas;&h5E5AAF7;&h49E30654;false Class=QTMedia;Modules/macoslib/QTKit/QTMedia.rbbas;&h293B82CD;&h49E30654;false Class=QTMovie;Modules/macoslib/QTKit/QTMovie.rbbas;&h208B787;&h49E30654;false Class=QTMovieView;Modules/macoslib/QTKit/QTMovieView.rbbas;&hA4942C2;&h49E30654;false Class=MDQuery;Modules/macoslib/Spotlight/MDQuery.rbbas;&h4FBE157A;&h57B4DC57;false Class=MDItem;Modules/macoslib/Spotlight/MDItem.rbbas;&h48746722;&h57B4DC57;false Class=SCDynamicStore;Modules/macoslib/SystemConfiguration/SCDynamicStore.rbbas;&h521F4FFD;&h22EE4263;false Class=SCNetworkInterface;Modules/macoslib/SystemConfiguration/SCNetworkInterface.rbbas;&h5BCD6D0;&h22EE4263;false Class=SCNetworkReachability;Modules/macoslib/SystemConfiguration/SCNetworkReachability.rbbas;&h30BB3647;&h22EE4263;false Class=WindowGroup;Modules/macoslib/WindowManager/WindowGroup.rbbas;&h52E8C9F5;&h4848C525;false Module=MacOSFolderItemExtension;Modules/macoslib/Convenience extensions and objects/MacOSFolderItemExtension.rbbas;&h31235FFF;&h66335755;false Module=UnicodeFormsExtension;Modules/macoslib/Convenience extensions and objects/UnicodeFormsExtension.rbbas;&h973B933;&h66335755;false Module=StringExtension;Modules/macoslib/Convenience extensions and objects/StringExtension.rbbas;&hC8409C4;&h66335755;false Module=SystemIcons;Modules/macoslib/Convenience extensions and objects/SystemIcons.rbbas;&h309D6AED;&h66335755;false Module=ExtendedAttributesExtensions;Modules/macoslib/Convenience extensions and objects/ExtendedAttributesExtensions.rbbas;&h2ED74830;&h66335755;false Module=ApplicationExtensions;Modules/macoslib/Convenience extensions and objects/ApplicationExtensions.rbbas;&h37C4A0FC;&h66335755;false Module=SystemExtensions;Modules/macoslib/Convenience extensions and objects/SystemExtensions.rbbas;&h4E255EA4;&h66335755;false Module=IntrospectionExtensions;Modules/macoslib/Convenience extensions and objects/IntrospectionExtensions.rbbas;&h7768CAB6;&h66335755;false Folder=Pasteboard reading and writing;Modules/macoslib/Convenience extensions and objects/Pasteboard reading and writing;&hD4F19F;&h66335755;false Class=MenuItemFileMenu;Modules/macoslib/Cocoa MenuItems/File Menu/MenuItemFileMenu.rbbas;&h1C433FCC;&h3D7A860F;false Class=CocoaMenuItemClose;Modules/macoslib/Cocoa MenuItems/File Menu/CocoaMenuItemClose.rbbas;&h311BA39;&h3D7A860F;false Class=CocoaMenuItemPrint;Modules/macoslib/Cocoa MenuItems/File Menu/CocoaMenuItemPrint.rbbas;&hD93768;&h3D7A860F;false Class=CocoaMenuItemPageSetup;Modules/macoslib/Cocoa MenuItems/File Menu/CocoaMenuItemPageSetup.rbbas;&h34C4CEED;&h3D7A860F;false Class=MenuItemEditMenu;Modules/macoslib/Cocoa MenuItems/Edit Menu/MenuItemEditMenu.rbbas;&h64ED8651;&h36F7A3F7;false Class=CocoaMenuItemUndo;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemUndo.rbbas;&h260DA541;&h36F7A3F7;false Class=CocoaMenuItemRedo;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemRedo.rbbas;&h49DCA391;&h36F7A3F7;false Class=CocoaMenuItemCut;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemCut.rbbas;&h3476EC1F;&h36F7A3F7;false Class=CocoaMenuItemCopy;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemCopy.rbbas;&h6B8843C7;&h36F7A3F7;false Class=CocoaMenuItemPaste;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemPaste.rbbas;&h3F1A369E;&h36F7A3F7;false Class=CocoaMenuItemPasteAndMatchStyle;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemPasteAndMatchStyle.rbbas;&h51F82115;&h36F7A3F7;false Class=CocoaMenuItemDelete;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemDelete.rbbas;&h79445563;&h36F7A3F7;false Class=CocoaMenuItemComplete;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemComplete.rbbas;&h7542566D;&h36F7A3F7;false Class=CocoaMenuItemSelectAll;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemSelectAll.rbbas;&h56388BE5;&h36F7A3F7;false Folder=Edit.Insert Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu;&h1A68D542;&h36F7A3F7;false Class=CocoaMenuItemEditLink;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemEditLink.rbbas;&h58892F3F;&h36F7A3F7;false Folder=Edit.Find Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu;&h167D4028;&h36F7A3F7;false Folder=Edit.Spelling Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu;&h78FF4F46;&h36F7A3F7;false Folder=Edit.Substitutions Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu;&h41ADFC5F;&h36F7A3F7;false Folder=Edit.Transformations Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu;&h594244F;&h36F7A3F7;false Folder=Edit.Speech Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Speech Menu;&h40DC030B;&h36F7A3F7;false Class=MenuItemFormatMenu;Modules/macoslib/Cocoa MenuItems/Format Menu/MenuItemFormatMenu.rbbas;&h2C4C2A17;&h3C2E0AF8;false Folder=Format.Font Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu;&h3C5FA45F;&h3C2E0AF8;false Folder=Format.Text Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu;&h2B20B996;&h3C2E0AF8;false Class=CocoaMenuItemList;Modules/macoslib/Cocoa MenuItems/Format Menu/CocoaMenuItemList.rbbas;&h71787E9E;&h3C2E0AF8;false Class=CocoaMenuItemTable;Modules/macoslib/Cocoa MenuItems/Format Menu/CocoaMenuItemTable.rbbas;&h1DC132EB;&h3C2E0AF8;false Class=MenuItemViewMenu;Modules/macoslib/Cocoa MenuItems/View Menu/MenuItemViewMenu.rbbas;&h76F63335;&h72D2804B;false Class=CocoaMenuItemShowToolbar;Modules/macoslib/Cocoa MenuItems/View Menu/CocoaMenuItemShowToolbar.rbbas;&h1D9C5B3D;&h72D2804B;false Class=CocoaMenuItemCustomizeToolbar;Modules/macoslib/Cocoa MenuItems/View Menu/CocoaMenuItemCustomizeToolbar.rbbas;&h42A52A1;&h72D2804B;false Class=MenuItemWindowMenu;Modules/macoslib/Cocoa MenuItems/Window Menu/MenuItemWindowMenu.rbbas;&h76970BCF;&h59E53877;false Class=MenuItemBringAllToFront;Modules/macoslib/Cocoa MenuItems/Window Menu/MenuItemBringAllToFront.rbbas;&h3688C182;&h59E53877;false Class=MenuItemMinimize;Modules/macoslib/Cocoa MenuItems/Window Menu/MenuItemMinimize.rbbas;&h4C589B6C;&h59E53877;false Class=MenuItemZoom;Modules/macoslib/Cocoa MenuItems/Window Menu/MenuItemZoom.rbbas;&h4D443842;&h59E53877;false Interface=PasteboardReadingAndWriting;Modules/macoslib/Convenience extensions and objects/Pasteboard reading and writing/PasteboardReadingAndWriting.rbbas;&h39C9DE55;&hD4F19F;false Module=PasteboardReadingAndWritingModule;Modules/macoslib/Convenience extensions and objects/Pasteboard reading and writing/PasteboardReadingAndWritingModule.rbbas;&h7423FDBC;&hD4F19F;false Class=CocoaMenuItemInsert;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu/CocoaMenuItemInsert.rbbas;&h66E7BEDB;&h1A68D542;false Class=CocoaMenuItemInsertParagraphBreak;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu/CocoaMenuItemInsertParagraphBreak.rbbas;&h78A3924A;&h1A68D542;false Class=CocoaMenuItemInsertLineBreak;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu/CocoaMenuItemInsertLineBreak.rbbas;&h3AD9B7CC;&h1A68D542;false Class=CocoaMenuItemInsertPageBreak;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu/CocoaMenuItemInsertPageBreak.rbbas;&h2BB211E9;&h1A68D542;false Class=CocoaMenuItemFindParent;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFindParent.rbbas;&h37B6300E;&h167D4028;false Class=CocoaMenuItemFindAbstract;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFindAbstract.rbbas;&h1A0D455B;&h167D4028;false Class=CocoaMenuItemFind;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFind.rbbas;&h5D44A85F;&h167D4028;false Class=CocoaMenuItemFindNext;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFindNext.rbbas;&h468A6675;&h167D4028;false Class=CocoaMenuItemFindPrevious;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFindPrevious.rbbas;&h284CF127;&h167D4028;false Class=CocoaMenuItemUseSelectionForFind;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemUseSelectionForFind.rbbas;&h536C8DC2;&h167D4028;false Class=CocoaMenuItemJumpToSelection;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemJumpToSelection.rbbas;&h7BCF27FD;&h167D4028;false Class=CocoaMenuItemSelectLine;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemSelectLine.rbbas;&h5D4AD431;&h167D4028;false Class=CocoaMenuItemEditSpelling;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemEditSpelling.rbbas;&h5BB14E76;&h78FF4F46;false Class=CocoaMenuItemShowSpelling;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemShowSpelling.rbbas;&h559695A7;&h78FF4F46;false Class=CocoaMenuItemCheckDocumentNow;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemCheckDocumentNow.rbbas;&h113B747D;&h78FF4F46;false Class=CocoaMenuItemCheckGrammarWithSpelling;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemCheckGrammarWithSpelling.rbbas;&h565D0507;&h78FF4F46;false Class=CocoaMenuItemCheckSpellingWhileTyping;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemCheckSpellingWhileTyping.rbbas;&h74F57C82;&h78FF4F46;false Class=CocoaMenuItemCorrectSpelling;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemCorrectSpelling.rbbas;&h20C1B871;&h78FF4F46;false Class=CocoaMenuItemEditSubstitutions;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemEditSubstitutions.rbbas;&hE34552A;&h41ADFC5F;false Class=CocoaMenuItemShowSubstitutions;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemShowSubstitutions.rbbas;&hDC38155;&h41ADFC5F;false Class=CocoaMenuItemSmartCopyPaste;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemSmartCopyPaste.rbbas;&h1E603C28;&h41ADFC5F;false Class=CocoaMenuItemSmartQuotes;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemSmartQuotes.rbbas;&h400DB752;&h41ADFC5F;false Class=CocoaMenuItemSmartDashes;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemSmartDashes.rbbas;&h447ECAFE;&h41ADFC5F;false Class=CocoaMenuItemSmartLinks;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemSmartLinks.rbbas;&h60414E79;&h41ADFC5F;false Class=CocoaMenuItemDataDetectors;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemDataDetectors.rbbas;&h5F875CF3;&h41ADFC5F;false Class=CocoaMenuItemTextReplacement;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemTextReplacement.rbbas;&h2FE7C82A;&h41ADFC5F;false Class=CocoaMenuItemEditTransformations;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu/CocoaMenuItemEditTransformations.rbbas;&h1A06979E;&h594244F;false Class=CocoaMenuItemMakeUppercase;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu/CocoaMenuItemMakeUppercase.rbbas;&h26CC5511;&h594244F;false Class=CocoaMenuItemMakeLowercase;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu/CocoaMenuItemMakeLowercase.rbbas;&h30E524A3;&h594244F;false Class=CocoaMenuItemCapitalize;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu/CocoaMenuItemCapitalize.rbbas;&h13C8A40F;&h594244F;false Class=CocoaMenuItemEditSpeech;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Speech Menu/CocoaMenuItemEditSpeech.rbbas;&h598B2094;&h40DC030B;false Class=CocoaMenuItemStartSpeaking;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Speech Menu/CocoaMenuItemStartSpeaking.rbbas;&h3D08441F;&h40DC030B;false Class=CocoaMenuItemStopSpeaking;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Speech Menu/CocoaMenuItemStopSpeaking.rbbas;&h69B0B02C;&h40DC030B;false Class=CocoaMenuItemFormatFont;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatFont.rbbas;&h4EFE908F;&h3C5FA45F;false Class=CocoaMenuItemFormatFontTrait;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatFontTrait.rbbas;&h2AC50673;&h3C5FA45F;false Class=CocoaMenuItemShowFonts;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemShowFonts.rbbas;&h6D2ABF9A;&h3C5FA45F;false Class=CocoaMenuItemFormatBold;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatBold.rbbas;&h1189911A;&h3C5FA45F;false Class=CocoaMenuItemFormatItalic;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatItalic.rbbas;&h5E958C9A;&h3C5FA45F;false Class=CocoaMenuItemFormatUnderline;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatUnderline.rbbas;&h2C42449F;&h3C5FA45F;false Class=CocoaMenuItemFormatOutline;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatOutline.rbbas;&h32A77B12;&h3C5FA45F;false Class=CocoaMenuItemFontStyles;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFontStyles.rbbas;&h1181365F;&h3C5FA45F;false Class=CocoaMenuItemModifyFont;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemModifyFont.rbbas;&h3A18E199;&h3C5FA45F;false Class=CocoaMenuItemBigger;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemBigger.rbbas;&h37836341;&h3C5FA45F;false Class=CocoaMenuItemSmaller;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemSmaller.rbbas;&h12E99E86;&h3C5FA45F;false Folder=Format.Font.Kern Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu;&h27A6BAC3;&h3C5FA45F;false Folder=Format.Font.Ligature Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu;&h332FAE31;&h3C5FA45F;false Folder=Format.Font.Baseline Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu;&h7F556EDD;&h3C5FA45F;false Folder=Format.Font.CharacterShape Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.CharacterShape Menu;&h41E1F220;&h3C5FA45F;false Class=CocoaMenuItemShowColors;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemShowColors.rbbas;&h58DF7650;&h3C5FA45F;false Class=CocoaMenuItemCopyStyle;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemCopyStyle.rbbas;&h36D0ED6B;&h3C5FA45F;false Class=CocoaMenuItemPasteStyle;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemPasteStyle.rbbas;&h4E936990;&h3C5FA45F;false Class=CocoaMenuItemFormatText;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemFormatText.rbbas;&h2FF7D6E3;&h2B20B996;false Class=CocoaMenuItemTextAlignLeft;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemTextAlignLeft.rbbas;&h383D2B55;&h2B20B996;false Class=CocoaMenuItemTextCenter;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemTextCenter.rbbas;&h37E837F1;&h2B20B996;false Class=CocoaMenuItemTextJustify;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemTextJustify.rbbas;&h6EB10D89;&h2B20B996;false Class=CocoaMenuItemTextAlignRight;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemTextAlignRight.rbbas;&h29F017CB;&h2B20B996;false Folder=Format.Text.WritingDirection Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu;&h51AA6795;&h2B20B996;false Class=CocoaMenuItemShowRuler;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemShowRuler.rbbas;&hA76D2BC;&h2B20B996;false Class=CocoaMenuItemCopyRuler;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemCopyRuler.rbbas;&h7F057BA7;&h2B20B996;false Class=CocoaMenuItemPasteRuler;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemPasteRuler.rbbas;&h40F993BD;&h2B20B996;false Class=CocoaMenuItemSpacing;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemSpacing.rbbas;&h4152C044;&h2B20B996;false Class=CocoaMenuItemFormatFontKern;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemFormatFontKern.rbbas;&h1FCD1383;&h27A6BAC3;false Class=CocoaMenuItemKernDefault;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemKernDefault.rbbas;&h50BC4F6A;&h27A6BAC3;false Class=CocoaMenuItemKernNone;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemKernNone.rbbas;&h7B022334;&h27A6BAC3;false Class=CocoaMenuItemKernTighten;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemKernTighten.rbbas;&h4955ABA9;&h27A6BAC3;false Class=CocoaMenuItemKernLoosen;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemKernLoosen.rbbas;&h17794B82;&h27A6BAC3;false Class=CocoaMenuItemLigature;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu/CocoaMenuItemLigature.rbbas;&h1C4C917E;&h332FAE31;false Class=CocoaMenuItemLigatureDefault;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu/CocoaMenuItemLigatureDefault.rbbas;&h66E4375B;&h332FAE31;false Class=CocoaMenuItemLigatureNone;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu/CocoaMenuItemLigatureNone.rbbas;&h10EEADC9;&h332FAE31;false Class=CocoaMenuItemLigatureAll;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu/CocoaMenuItemLigatureAll.rbbas;&h25D3B174;&h332FAE31;false Class=CocoaMenuItemFormatFontBaseline;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemFormatFontBaseline.rbbas;&h6D278BB8;&h7F556EDD;false Class=CocoaMenuItemBaselineDefault;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineDefault.rbbas;&h3F4656AA;&h7F556EDD;false Class=CocoaMenuItemBaselineSuperscript;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineSuperscript.rbbas;&h22E41500;&h7F556EDD;false Class=CocoaMenuItemBaselineSubscript;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineSubscript.rbbas;&h2C1F068B;&h7F556EDD;false Class=CocoaMenuItemBaselineRaise;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineRaise.rbbas;&h28E6E7F4;&h7F556EDD;false Class=CocoaMenuItemBaselineLower;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineLower.rbbas;&h4F869ACC;&h7F556EDD;false Class=CocoaMenuItemFormatFontCharacterShape;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.CharacterShape Menu/CocoaMenuItemFormatFontCharacterShape.rbbas;&hE1D3184;&h41E1F220;false Class=CocoaMenuItemCharShapeTraditional;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.CharacterShape Menu/CocoaMenuItemCharShapeTraditional.rbbas;&h1E9E19FF;&h41E1F220;false Class=CocoaMenuItemWritingDirection;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirection.rbbas;&h1DBD05B3;&h51AA6795;false Class=CocoaMenuItemWritingDirectionBase;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionBase.rbbas;&h64C17BAB;&h51AA6795;false Class=CocoaMenuItemWritingDirectionBaseNatural;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionBaseNatural.rbbas;&h5A9E8CE0;&h51AA6795;false Class=CocoaMenuItemWritingDirectionBaseLeftToRight;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionBaseLeftToRight.rbbas;&h5F333640;&h51AA6795;false Class=CocoaMenuItemWritingDirectionBaseRightToLeft;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionBaseRightToLeft.rbbas;&h1B2F163A;&h51AA6795;false Class=CocoaMenuItemWritingDirectionText;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionText.rbbas;&h305C896D;&h51AA6795;false Class=CocoaMenuItemWritingDirectionTextNatural;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionTextNatural.rbbas;&hB42AD8F;&h51AA6795;false Class=CocoaMenuItemWritingDirectionTextLeftToRight;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionTextLeftToRight.rbbas;&h4690CEB5;&h51AA6795;false Class=CocoaMenuItemWritingDirectionTextRightToLeft;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionTextRightToLeft.rbbas;&h4CF332EA;&h51AA6795;false Folder=Testing Grounds;Testing Grounds;&h5104D6F6;&h0;false Window=wndMainAlt;Testing Grounds/wndMainAlt.rbfrm;&h14BD1BAE;&h5104D6F6;false Class=MainToolbar;Testing Grounds/MainToolbar.rbbas;&hB6488CB;&h5104D6F6;false Module=ssWindowExtensions;Modules/macoslib/Convenience extensions and objects/ssWindowExtensions.rbbas;&h2698B23E;&h66335755;false Module=XMLDictionary;Modules/XMLDictionary.rbbas;&h7D72CDCA;&h298F9D05;false Folder=Flags;Images/Flags;&h70649F71;&h5510FB7A;false Picture=br;Images/Flags/br.png;&h5E202F02;&h70649F71;false;0;&h0 Picture=cn;Images/Flags/cn.png;&h12EE9E3B;&h70649F71;false;0;&h0 Picture=cs;Images/Flags/cs.png;&h6FD67ED8;&h70649F71;false;0;&h0 Picture=da;Images/Flags/da.png;&h6B2211EA;&h70649F71;false;0;&h0 Picture=de;Images/Flags/de.png;&h9C6923F;&h70649F71;false;0;&h0 Picture=es;Images/Flags/es.png;&h4BABACC2;&h70649F71;false;0;&h0 Picture=fi;Images/Flags/fi.png;&h73DB5D03;&h70649F71;false;0;&h0 Picture=fr;Images/Flags/fr.png;&h46B7ED07;&h70649F71;false;0;&h0 Picture=gb;Images/Flags/gb.png;&h552ACC7C;&h70649F71;false;0;&h0 Picture=gr;Images/Flags/gr.png;&h6CD74E38;&h70649F71;false;0;&h0 Picture=hr;Images/Flags/hr.png;&h2B50B801;&h70649F71;false;0;&h0 Picture=hu;Images/Flags/hu.png;&h4060A184;&h70649F71;false;0;&h0 Picture=il;Images/Flags/il.png;&h80C43C7;&h70649F71;false;0;&h0 Picture=it;Images/Flags/it.png;&h5D360397;&h70649F71;false;0;&h0 Picture=ja;Images/Flags/ja.png;&h5261FF6;&h70649F71;false;0;&h0 Picture=kr;Images/Flags/kr.png;&h9FC93C4;&h70649F71;false;0;&h0 Picture=nl;Images/Flags/nl.png;&h25496FA1;&h70649F71;false;0;&h0 Picture=no;Images/Flags/no.png;&h784007CC;&h70649F71;false;0;&h0 Picture=pl;Images/Flags/pl.png;&h33C06167;&h70649F71;false;0;&h0 Picture=pt;Images/Flags/pt.png;&h1B3B0D62;&h70649F71;false;0;&h0 Picture=ru;Images/Flags/ru.png;&h41EBEC8B;&h70649F71;false;0;&h0 Picture=sl;Images/Flags/sl.png;&h67F6FD22;&h70649F71;false;0;&h0 Picture=sv;Images/Flags/sv.png;&h8653A27;&h70649F71;false;0;&h0 Picture=tr;Images/Flags/tr.png;&h2DCD1C65;&h70649F71;false;0;&h0 Picture=us;Images/Flags/us.png;&h75038406;&h70649F71;false;0;&h0 Picture=lockedactive2x;Images/MovieDataTags@2x/locked-active@2x.png;&hF151CB1;&h62FA8680;false;0;&h0 Picture=lockedinactive2x;Images/MovieDataTags@2x/locked-inactive@2x.png;&h330EF1D9;&h62FA8680;false;0;&h0 Picture=lockedactive;Images/MovieDataTags/locked-active.png;&h1A283965;&h6E81FC20;false;0;&h0 Picture=lockedinactive;Images/MovieDataTags/locked-inactive.png;&h46D064F3;&h6E81FC20;false;0;&h0 Module=TraktTV;CoreServices/TraktTV.rbbas;&hB950306;&h18E3FCD2;false Window=wndRecommendations;Windows/Utility/wndRecommendations.rbfrm;&h5D31FECE;&h42AC283B;false Picture=status_rejected2x;Images/Status/status_rejected@2x.png;&hEF371A0;&h3D93657B;false;0;&h0 Picture=tb_services;Images/tb icons/tb_services.png;&h34F4A590;&h16FC0271;false;0;&h0 Picture=tb_services2x;Images/tb icons/tb_services@2x.png;&h29A1EDBF;&h16FC0271;false;0;&h0 Folder=Icons;Images/Icons;&h45F74405;&h5510FB7A;false Picture=facebook;Images/Icons/facebook.png;&h6C9309CB;&h45F74405;false;0;&h0 Picture=icoamazon;Images/Icons/ico-amazon.png;&h5748A18;&h45F74405;false;0;&h0 Picture=icoaol;Images/Icons/ico-aol.png;&h2616721A;&h45F74405;false;0;&h0 Picture=icoapple;Images/Icons/ico-apple.png;&hB9D5E25;&h45F74405;false;0;&h0 Picture=icoebay;Images/Icons/ico-ebay.png;&h89016BE;&h45F74405;false;0;&h0 Picture=icofacebook;Images/Icons/ico-facebook.png;&h2BC559FC;&h45F74405;false;0;&h0 Picture=icogoogle;Images/Icons/ico-google.png;&h2997077D;&h45F74405;false;0;&h0 Picture=icohdtrailershd;Images/Icons/ico-hdtrailers-hd.png;&h7A6CF685;&h45F74405;false;0;&h0 Picture=icohdtrailers;Images/Icons/ico-hdtrailers.png;&h7AD1634;&h45F74405;false;0;&h0 Picture=icoimdbhd;Images/Icons/ico-imdb-hd.png;&h748CF581;&h45F74405;false;0;&h0 Picture=icoimdb;Images/Icons/ico-imdb.png;&h524A6594;&h45F74405;false;0;&h0 Picture=icokat;Images/Icons/ico-kat.png;&h12534367;&h45F74405;false;0;&h0 Picture=icomoviesio;Images/Icons/ico-moviesio.png;&h186E6A3D;&h45F74405;false;0;&h0 Picture=iconetflix;Images/Icons/ico-netflix.png;&h790118F8;&h45F74405;false;0;&h0 Picture=icorottentomatoes;Images/Icons/ico-rottentomatoes.png;&h370EC17E;&h45F74405;false;0;&h0 Picture=icotmdbhd;Images/Icons/ico-tmdb-hd.png;&h29C19515;&h45F74405;false;0;&h0 Picture=icotmdb;Images/Icons/ico-tmdb.png;&h6422ECC3;&h45F74405;false;0;&h0 Picture=icotorrentz;Images/Icons/ico-torrentz.png;&h30E66B37;&h45F74405;false;0;&h0 Picture=icotpb;Images/Icons/ico-tpb.png;&h6789429B;&h45F74405;false;0;&h0 Picture=icotrakttvhd;Images/Icons/ico-trakttv-hd.png;&h647444DD;&h45F74405;false;0;&h0 Picture=icotrakttv;Images/Icons/ico-trakttv.png;&hD557E57;&h45F74405;false;0;&h0 Picture=icotvdbhd;Images/Icons/ico-tvdb-hd.png;&h67D9CA3D;&h45F74405;false;0;&h0 Picture=icotvdb;Images/Icons/ico-tvdb.png;&hB6CE1B5;&h45F74405;false;0;&h0 Picture=icotvragehd;Images/Icons/ico-tvrage-hd.png;&h19567995;&h45F74405;false;0;&h0 Picture=icotvtuneshd;Images/Icons/ico-tvtunes-hd.png;&h7C4873D7;&h45F74405;false;0;&h0 Picture=icotvtunes;Images/Icons/ico-tvtunes.png;&h78ADA9A5;&h45F74405;false;0;&h0 Picture=icotweet;Images/Icons/ico-tweet.png;&h515D0F2E;&h45F74405;false;0;&h0 Picture=icowatchseries;Images/Icons/ico-watchseries.png;&h34900063;&h45F74405;false;0;&h0 Picture=icowikipedia;Images/Icons/ico-wikipedia.png;&h5A09C030;&h45F74405;false;0;&h0 Picture=icoyahoo;Images/Icons/ico-yahoo.png;&h3628FF24;&h45F74405;false;0;&h0 Picture=icoyify;Images/Icons/ico-yify.png;&h3D86F1E9;&h45F74405;false;0;&h0 Picture=icoyourtvseries;Images/Icons/ico-yourtvseries.png;&h66745933;&h45F74405;false;0;&h0 Picture=icoyoutube;Images/Icons/ico-youtube.png;&h608C9977;&h45F74405;false;0;&h0 Picture=mail;Images/Icons/mail.png;&h2EAFC6CC;&h45F74405;false;0;&h0 Picture=tvr_logo;Images/Icons/tvr_logo.png;&h1624D4AC;&h45F74405;false;0;&h0 Picture=twitter;Images/Icons/twitter.png;&h4C06B535;&h45F74405;false;0;&h0 Picture=icofanarttvhd;Images/Icons/ico-fanarttv-hd.png;&h51C23BF8;&h45F74405;false;0;&h0 Window=wndTVGuide;Windows/Utility/wndTVGuide.rbfrm;&h73FA5C7F;&h42AC283B;false Picture=ca;Images/Flags/ca.png;&h34985E3B;&h70649F71;false;0;&h0 Picture=au;Images/Flags/au.png;&h15DD6138;&h70649F71;false;0;&h0 Picture=be;Images/Flags/be.png;&h7919F064;&h70649F71;false;0;&h0 Picture=se;Images/Flags/se.png;&h342D1D96;&h70649F71;false;0;&h0 Picture=ie;Images/Flags/ie.png;&h44281EB0;&h70649F71;false;0;&h0 Picture=tb_tvguide;Images/tb icons/tb_tvguide.png;&h7F17EE85;&h16FC0271;false;0;&h0 Picture=tb_tvguide2x;Images/tb icons/tb_tvguide@2x.png;&h7C2CE098;&h16FC0271;false;0;&h0 Picture=mx;Images/Flags/mx.png;&h5CAC9293;&h70649F71;false;0;&h0 Picture=metatagsaudiodtshd_ma;Images/Metatags/metatags-audio-dtshd_ma.png;&h5577D833;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiodts_ma;Images/Metatags/metatags-audio-dts_ma.png;&h5AB5244F;&h3C0EB9D;false;0;&h0 Picture=icometa;Images/Icons/ico-meta.png;&h53D78B94;&h45F74405;false;0;&h0 Window=wndTVGuideNew;Windows/Utility/wndTVGuideNew.rbfrm;&h5169ABEC;&h42AC283B;false Module=NativeSubclass;Modules/NativeSubclass/NativeSubclass.rbbas;&h70967E5B;&h298F9D05;false Class=DateExtended;Modules/NativeSubclass/DateExtended.rbbas;&h6050BDA;&h70967E5B;false Class=RatingCanvas;Classes/RatingCanvas.rbbas;&h6D508849;&h61F91BC9;false Picture=icotorrentreactor;Images/Icons/ico-torrentreactor.png;&h674C9859;&h45F74405;false;0;&h0 Picture=icoleetx;Images/Icons/ico-leetx.png;&h55A671B0;&h45F74405;false;0;&h0 Picture=icoextratorrent;Images/Icons/ico-extratorrent.png;&h7CAD498C;&h45F74405;false;0;&h0 Picture=icorarbg;Images/Icons/ico-rarbg.png;&h54B807EC;&h45F74405;false;0;&h0 Picture=icolimetorrents;Images/Icons/ico-limetorrents.png;&h7E10840D;&h45F74405;false;0;&h0 Picture=icoeztv;Images/Icons/ico-eztv.png;&h6E4DF3C9;&h45F74405;false;0;&h0 Picture=icotorrenthound;Images/Icons/ico-torrenthound.png;&h3FC08B58;&h45F74405;false;0;&h0 Picture=icotorrentdownloads;Images/Icons/ico-torrentdownloads.png;&h389E1D77;&h45F74405;false;0;&h0 Picture=icobitsnoop;Images/Icons/ico-bitsnoop.png;&h14A0CE51;&h45F74405;false;0;&h0 Picture=icotorlock;Images/Icons/ico-torlock.png;&h49497411;&h45F74405;false;0;&h0 Module=RegExExtensions;Modules/RegExExtensions.rbbas;&h3981205A;&h298F9D05;false DefaultWindow=wndMain AppMenuBar=mBarMain MajorVersion=0 MinorVersion=7 SubVersion=0 NonRelease=15 Release=1 InfoVersion=Multi media manager LongVersion=v0.7α15 ©2011-2017 Vidal van Bergen ShortVersion=v0.7α15 WinCompanyName=Vitalis Software WinInternalName=#App.kAppName WinProductName=#App.kAppName AutoIncrementVersionInformation=False BuildFlags=&h1900 BuildLanguage=&h1 DebugLanguage=&h1 Region= WindowsName=ViMediaManager.exe MacCarbonMachName=#App.kAppName LinuxX86Name=#App.kAppName MacCreator=ViMM MDI=0 MDICaption= DefaultEncoding=&h0 AppIcon=ViMM.rbres;&h0 OSXBundleID=#App.Identifier DebuggerCommandLine= UseGDIPlus=True UseBuildsFolder=True IsWebProject=False \ No newline at end of file +Type=Desktop RBProjectVersion=2012.021 MinIDEVersion=20070100 Class=App;App.rbbas;&h5FF03C73;&h0;false MenuBar=mBarMain;mBarMain.rbmnu;&h1471CA94;&h0;false FileTypeSet=FileTypes;FileTypes.rbbas;&h4DEE73DD;&h0;false Folder=Windows;Windows;&h5241B183;&h0;false Window=wndMain;Windows/wndMain.rbfrm;&h151114E0;&h5241B183;false Folder=Modules;Modules;&h298F9D05;&h0;false Folder=Translations;Modules/Translations;&h73420CB;&h298F9D05;false Folder=macoslib;Modules/macoslib;&h3CAB55D;&h298F9D05;false Folder=CoreServices;CoreServices;&h18E3FCD2;&h0;false Module=Loc;Modules/Translations/Loc.rbbas;&h48471A4E;&h73420CB;false Folder=Classes;Classes;&h61F91BC9;&h0;false Toolbar=ToolPrefs;Classes/ToolPrefs.rbtbar;&h38CFB01;&h61F91BC9;false Toolbar=ToolMain;Classes/ToolMain.rbtbar;&h427F5BFD;&h61F91BC9;false Toolbar=TbMetadataMovies;Classes/TbMetadataMovies.rbtbar;&h410A5093;&h61F91BC9;false Toolbar=TbMetadataShows;Classes/TbMetadataShows.rbtbar;&h787EAC27;&h61F91BC9;false Window=ccProgress;Classes/ccProgress.rbfrm;&h70D29A48;&h61F91BC9;false Class=cvsLogo;Classes/cvsLogo.rbbas;&h2E62D6D0;&h61F91BC9;false Folder=Images;Images;&h5510FB7A;&h0;false Picture=videocleansmall;Images/videoclean-small.png;&h185EB5B;&h5510FB7A;false;0;&h0 Picture=videoclean;Images/videoclean.png;&h5DCF8ED6;&h5510FB7A;false;0;&h0 Picture=videoclean2x;Images/videoclean@2x.png;&h8988ED;&h5510FB7A;false;0;&h0 Picture=videounwatchedsmall;Images/videounwatched-small.png;&h7F1EE5CA;&h5510FB7A;false;0;&h0 Picture=videounwatched;Images/videounwatched.png;&h5CCAF42E;&h5510FB7A;false;0;&h0 Picture=videounwatched2x;Images/videounwatched@2x.png;&h1EC4A669;&h5510FB7A;false;0;&h0 Picture=videowatchedsmall;Images/videowatched-small.png;&h4580B39F;&h5510FB7A;false;0;&h0 Picture=videowatched;Images/videowatched.png;&h10656940;&h5510FB7A;false;0;&h0 Picture=videowatched2x;Images/videowatched@2x.png;&h457CC187;&h5510FB7A;false;0;&h0 Folder=Resources;Resources;&h23881057;&h0;false BuildSteps=Build Automation;Build Automation.rbbas;&h3AAB06AE;&h0;false Class=ListboxPRO;Classes/ListboxPRO.rbbas;&h139E729;&h61F91BC9;false Class=LinkLabel;Classes/LinkLabel.rbbas;&h260E4C7C;&h61F91BC9;false Folder=LinkLabelCanvas;Classes/LinkLabelCanvas;&h3C526144;&h61F91BC9;false Class=LinkLabelCanvas;Classes/LinkLabelCanvas/LinkLabelCanvas.rbbas;&h6CBA6067;&h3C526144;false Window=ccCancelSave;Classes/ccCancelSave.rbfrm;&h53533074;&h61F91BC9;false Class=AddRemoveButtons;Classes/AddRemoveButtons.rbbas;&h66FE0580;&h61F91BC9;false Module=ViMMCore;Modules/ViMMCore.rbbas;&h7EAD4C74;&h298F9D05;false Module=CommonCore;Modules/CommonCore.rbbas;&h2469CD0C;&h298F9D05;false Folder=TTsMarsSplitter;Classes/TTsMarsSplitter;&h5BB976E9;&h61F91BC9;false Class=MarsSplitter;Classes/TTsMarsSplitter/MarsSplitter.rbbas;&h6D2E2BB0;&h5BB976E9;false Module=TTsUITools;Classes/TTsMarsSplitter/TTsUITools.rbbas;&h7236A975;&h5BB976E9;false Picture=aboutbg;Images/aboutbg.jpg;&h569AB73D;&h5510FB7A;false;0;&h0 Window=wndAbout;Windows/wndAbout.rbfrm;&h477473DC;&h5241B183;false Picture=Vitalis;Images/Vitalis.png;&h38879235;&h5510FB7A;false;0;&h0 Picture=Vitalis2x;Images/Vitalis@2x.png;&h1FF5C02E;&h5510FB7A;false;0;&h0 Module=Menu;Modules/Translations/Menu.rbbas;&h6F5534C4;&h73420CB;false Window=wndPreferences;Windows/wndPreferences.rbfrm;&h62C2FA2A;&h5241B183;false Picture=HelpActiveArrow;Classes/LinkLabelCanvas/HelpActiveArrow.png;&h1B34759E;&h3C526144;false;0;&h0 Picture=HelpInactiveArrow;Classes/LinkLabelCanvas/HelpInactiveArrow.png;&h111627AC;&h3C526144;false;0;&h0 Folder=Toolbar Icons;Images/Toolbar Icons;&h1CB3421F;&h5510FB7A;false Picture=ToolPreferences;Images/Toolbar Icons/ToolPreferences.png;&h3ED25B5;&h1CB3421F;false;0;&h0 Picture=ToolPreferences2x;Images/Toolbar Icons/ToolPreferences@2x.png;&h290F1FDF;&h1CB3421F;false;0;&h0 Picture=ToolMovies;Images/Toolbar Icons/ToolMovies.png;&h414A871E;&h1CB3421F;false;0;&h0 Picture=ToolTVShows;Images/Toolbar Icons/ToolTVShows.png;&h616CBDE6;&h1CB3421F;false;0;&h0 Picture=ToolMonitor;Images/Toolbar Icons/ToolMonitor.png;&h31E73120;&h1CB3421F;false;0;&h0 Picture=ToolUpdate;Images/Toolbar Icons/ToolUpdate.tiff;&h2A27BAA8;&h1CB3421F;false;0;&h0 Folder=ActionBar;Classes/ActionBar;&h44BF8D21;&h61F91BC9;false Class=ActionBar;Classes/ActionBar/ActionBar.rbbas;&h491D7EE9;&h44BF8D21;false Picture=ActionWidget;Classes/ActionBar/ActionWidget.png;&h7BCAD66F;&h44BF8D21;false;0;&h0 Module=Preferences;Modules/Preferences.rbbas;&h41C4928D;&h298F9D05;false Folder=SearchBar;Classes/SearchBar;&h11C5FE35;&h61F91BC9;false Window=wndSplash;Windows/wndSplash.rbfrm;&h2601D4F0;&h5241B183;false Module=Growl;Modules/Growl.rbbas;&h3A3001F4;&h298F9D05;false Module=nc;Modules/nc/nc.rbbas;&h4AA84F20;&h298F9D05;false Module=MovieAttr;CoreServices/MovieAttr.rbbas;&h1FEB8D68;&h18E3FCD2;false Module=TVAttr;CoreServices/TVAttr.rbbas;&h2190F8DD;&h18E3FCD2;false Module=AnimeAttr;CoreServices/AnimeAttr.rbbas;&h34C2C808;&h18E3FCD2;false Class=AniDB;CoreServices/AniDB.rbbas;&h2FF63174;&h18E3FCD2;false Class=TVRage;CoreServices/TVRage.rbbas;&h4E476018;&h18E3FCD2;false Class=TVMaze;CoreServices/TVMaze.rbbas;&h12032AE8;&h18E3FCD2;false Class=TVDBSckt;CoreServices/TVDBSckt.rbbas;&h1DCE6760;&h18E3FCD2;false Class=MovieSckt;CoreServices/MovieSckt.rbbas;&h23DD502A;&h18E3FCD2;false Module=MovieCore;CoreServices/MovieCore.rbbas;&h5FDAE1ED;&h18E3FCD2;false Module=TVCore;CoreServices/TVCore.rbbas;&h5DFA8D3D;&h18E3FCD2;false Folder=Rating;Images/Rating;&h5EFD8BE3;&h5510FB7A;false Folder=MovieDataTags;Images/MovieDataTags;&h6E81FC20;&h5510FB7A;false Folder=MovieDataTags@2x;Images/MovieDataTags@2x;&h62FA8680;&h5510FB7A;false Picture=Rating_G;Images/Rating/Rating_G.png;&h57EB5673;&h5EFD8BE3;false;0;&h0 Picture=Rating_NC17;Images/Rating/Rating_NC-17.png;&h1B7906C3;&h5EFD8BE3;false;0;&h0 Picture=Rating_PG13;Images/Rating/Rating_PG-13.png;&h26AB3BF2;&h5EFD8BE3;false;0;&h0 Picture=Rating_PG;Images/Rating/Rating_PG.png;&h33ECE259;&h5EFD8BE3;false;0;&h0 Picture=Rating_R;Images/Rating/Rating_R.png;&h5009D57;&h5EFD8BE3;false;0;&h0 Picture=Rating_TV14;Images/Rating/Rating_TV-14.png;&h6B59FEF7;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVG;Images/Rating/Rating_TV-G.png;&h617282D6;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVMA;Images/Rating/Rating_TV-MA.png;&h24EC233B;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVPG;Images/Rating/Rating_TV-PG.png;&hAFD4B13;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVY;Images/Rating/Rating_TV-Y.png;&h7B4C13AD;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVY7;Images/Rating/Rating_TV-Y7.png;&h3FA043BE;&h5EFD8BE3;false;0;&h0 Picture=Rating_TVY7FV;Images/Rating/Rating_TV-Y7FV.png;&h32BFD13A;&h5EFD8BE3;false;0;&h0 Picture=rtratingcertified;Images/Rating/rt-rating-certified.png;&hB157621;&h5EFD8BE3;false;0;&h0 Picture=rtratingfresh;Images/Rating/rt-rating-fresh.png;&h2DFEB7DC;&h5EFD8BE3;false;0;&h0 Picture=rtratingrotten;Images/Rating/rt-rating-rotten.png;&h2DD925C1;&h5EFD8BE3;false;0;&h0 Picture=rtratingupright;Images/Rating/rt-rating-upright.png;&h122E6081;&h5EFD8BE3;false;0;&h0 Picture=rtratingspilled;Images/Rating/rt-rating-spilled.png;&hB3DFB11;&h5EFD8BE3;false;0;&h0 Class=ListMovies;Classes/ListMovies.rbbas;&h2163D1CE;&h61F91BC9;false Class=ListTVShows;Classes/ListTVShows.rbbas;&h7D599A01;&h61F91BC9;false Folder=FanArt;Images/FanArt;&h2EDA3B96;&h5510FB7A;false Folder=Help Button;Images/Help Button;&h7D44DC01;&h5510FB7A;false Folder=Kijkwijzer;Images/Kijkwijzer;&h18C3ECA5;&h5510FB7A;false Picture=BannerOverlay;Images/FanArt/BannerOverlay.png;&h53560107;&h2EDA3B96;false;0;&h0 Picture=IMGFanartOverlay;Images/FanArt/IMGFanartOverlay.png;&h335DDEF5;&h2EDA3B96;false;0;&h0 Picture=IMGmovies;Images/FanArt/IMGmovies.jpg;&h57D902D1;&h2EDA3B96;false;0;&h0 Picture=IMGtvshows;Images/FanArt/IMGtvshows.jpg;&h6848560B;&h2EDA3B96;false;0;&h0 Picture=miniconmovie;Images/minicon-movie.png;&h341DD4E8;&h5510FB7A;false;0;&h0 Class=ExtraArtCanvas;Classes/ExtraArtCanvas.rbbas;&h69AD46E7;&h61F91BC9;false Window=dlgProgress;Windows/dlgProgress.rbfrm;&h4B33AA6;&h5241B183;false Class=SuperTextfield;Classes/SuperTextfield.rbbas;&h1657E410;&h61F91BC9;false Class=SuperTextArea;Classes/SuperTextArea.rbbas;&h643E238B;&h61F91BC9;false Picture=sweep;Images/sweep.png;&h659103B9;&h5510FB7A;false;0;&h0 Picture=Boxee;Images/Boxee.png;&h5ADD2DCD;&h5510FB7A;false;0;&h0 Class=MyHierListBox;Classes/MyHierListBox.rbbas;&h45F6773A;&h61F91BC9;false Folder=NL;Images/Rating/NL;&h63BA13FB;&h5EFD8BE3;false Folder=UK;Images/Rating/UK;&h4D763889;&h5EFD8BE3;false Folder=DE;Images/Rating/DE;&hC7A13C0;&h5EFD8BE3;false Picture=Rating_FSK0;Images/Rating/DE/Rating_FSK-0.png;&h22A6EA4C;&hC7A13C0;false;0;&h0 Picture=Rating_FSK6;Images/Rating/DE/Rating_FSK-6.png;&h7C6076FF;&hC7A13C0;false;0;&h0 Picture=Rating_FSK12;Images/Rating/DE/Rating_FSK-12.png;&h2124E0CA;&hC7A13C0;false;0;&h0 Picture=Rating_FSK16;Images/Rating/DE/Rating_FSK-16.png;&h7C22406B;&hC7A13C0;false;0;&h0 Picture=Rating_FSK18;Images/Rating/DE/Rating_FSK-18.png;&h2CB3B21E;&hC7A13C0;false;0;&h0 Picture=Rating_UK12;Images/Rating/UK/Rating_UK-12.png;&h49732825;&h4D763889;false;0;&h0 Picture=Rating_UK12A;Images/Rating/UK/Rating_UK-12A.png;&h2750FC75;&h4D763889;false;0;&h0 Picture=Rating_UK15;Images/Rating/UK/Rating_UK-15.png;&h35EEBB23;&h4D763889;false;0;&h0 Picture=Rating_UK18;Images/Rating/UK/Rating_UK-18.png;&h4C405424;&h4D763889;false;0;&h0 Picture=Rating_UKPG;Images/Rating/UK/Rating_UK-PG.png;&h1354703E;&h4D763889;false;0;&h0 Picture=Rating_UKU;Images/Rating/UK/Rating_UK-U.png;&hC954202;&h4D763889;false;0;&h0 Picture=Rating_UKUc;Images/Rating/UK/Rating_UK-Uc.png;&h1B20D968;&h4D763889;false;0;&h0 Picture=Rating_UKR18;Images/Rating/UK/Rating_UK-R18.png;&h24465C5E;&h4D763889;false;0;&h0 Picture=Rating_NL6;Images/Rating/NL/Rating_NL-6.png;&h9A18A68;&h63BA13FB;false;0;&h0 Picture=Rating_NL9;Images/Rating/NL/Rating_NL-9.png;&h4C85F86E;&h63BA13FB;false;0;&h0 Picture=Rating_NL12;Images/Rating/NL/Rating_NL-12.png;&h6F7966A7;&h63BA13FB;false;0;&h0 Picture=Rating_NL16;Images/Rating/NL/Rating_NL-16.png;&hB42D8C4;&h63BA13FB;false;0;&h0 Picture=Rating_NLAL;Images/Rating/NL/Rating_NL-AL.png;&h51A57348;&h63BA13FB;false;0;&h0 Folder=FR;Images/Rating/FR;&h52A36656;&h5EFD8BE3;false Picture=Rating_FR10;Images/Rating/FR/Rating_FR-10.png;&h65940422;&h52A36656;false;0;&h0 Picture=Rating_FR12;Images/Rating/FR/Rating_FR-12.png;&h589BC9ED;&h52A36656;false;0;&h0 Picture=Rating_FR16;Images/Rating/FR/Rating_FR-16.png;&h5BE655B3;&h52A36656;false;0;&h0 Picture=Rating_FR18;Images/Rating/FR/Rating_FR-18.png;&h6F04CB8D;&h52A36656;false;0;&h0 Picture=Rating_FRU;Images/Rating/FR/Rating_FR-U.png;&h23D01092;&h52A36656;false;0;&h0 Picture=XBMC;Images/XBMC.png;&h1EAFDCAB;&h5510FB7A;false;0;&h0 Picture=YAMJ;Images/YAMJ.png;&h2BC0AFF0;&h5510FB7A;false;0;&h0 Folder=Obsolete;Obsolete;&h54E45B12;&h0;false Window=ccSearch;Classes/SearchBar/ccSearch.rbfrm;&h1B441135;&h11C5FE35;false Picture=remove;Classes/SearchBar/remove.png;&h5DB49456;&h11C5FE35;false;0;&h0 Picture=removepressed;Classes/SearchBar/removepressed.png;&h7A770BCF;&h11C5FE35;false;0;&h0 Picture=searchglass;Classes/SearchBar/searchglass.png;&h1DA8C37F;&h11C5FE35;false;0;&h0 Picture=HelpButton;Images/Help Button/HelpButton.png;&h33C8478D;&h7D44DC01;false;0;&h0 Picture=HelpButtonInactive;Images/Help Button/HelpButtonInactive.png;&h21D1D630;&h7D44DC01;false;0;&h0 Picture=HelpButtonPressed;Images/Help Button/HelpButtonPressed.png;&h57453C4E;&h7D44DC01;false;0;&h0 Class=btnImage;Classes/btnImage.rbbas;&h1AC435C1;&h61F91BC9;false Class=TrailerSckt;CoreServices/TrailerSckt.rbbas;&h57B2FA7A;&h18E3FCD2;false Window=ccThumbView;Classes/ccThumbView.rbfrm;&h60C0C05E;&h61F91BC9;false Folder=FI;Images/Rating/FI;&h75A7393;&h5EFD8BE3;false Picture=Rating_FIK7;Images/Rating/FI/Rating_FI-K7.png;&h4359FD50;&h75A7393;false;0;&h0 Picture=Rating_FIK11;Images/Rating/FI/Rating_FI-K11.png;&h1AAA2C07;&h75A7393;false;0;&h0 Picture=Rating_FIK12;Images/Rating/FI/Rating_FI-K12.png;&h4905F361;&h75A7393;false;0;&h0 Picture=Rating_FIK16;Images/Rating/FI/Rating_FI-K16.png;&h25ADCC61;&h75A7393;false;0;&h0 Picture=Rating_FIK18;Images/Rating/FI/Rating_FI-K18.png;&h35454940;&h75A7393;false;0;&h0 Picture=Rating_FIKE;Images/Rating/FI/Rating_FI-KE.png;&h57CC65B8;&h75A7393;false;0;&h0 Picture=Rating_FIS;Images/Rating/FI/Rating_FI-S.png;&h2C2A81B6;&h75A7393;false;0;&h0 Folder=Misc;Images/Rating/Misc;&h1A30CEE4;&h5EFD8BE3;false Picture=Rating_U;Images/Rating/Misc/Rating_U.png;&h3A18BEA3;&h1A30CEE4;false;0;&h0 Picture=Rating_10;Images/Rating/Misc/Rating_10.png;&h7A5F29D0;&h1A30CEE4;false;0;&h0 Picture=Rating_11;Images/Rating/Misc/Rating_11.png;&h7DB29719;&h1A30CEE4;false;0;&h0 Picture=Rating_12;Images/Rating/Misc/Rating_12.png;&h57DE6C6D;&h1A30CEE4;false;0;&h0 Picture=Rating_13;Images/Rating/Misc/Rating_13.png;&h4BA0D6D2;&h1A30CEE4;false;0;&h0 Picture=Rating_14;Images/Rating/Misc/Rating_14.png;&h2C77DD6E;&h1A30CEE4;false;0;&h0 Picture=Rating_15;Images/Rating/Misc/Rating_15.png;&h716AB936;&h1A30CEE4;false;0;&h0 Picture=Rating_16;Images/Rating/Misc/Rating_16.png;&h15A6040C;&h1A30CEE4;false;0;&h0 Picture=Rating_17;Images/Rating/Misc/Rating_17.png;&h4653FC94;&h1A30CEE4;false;0;&h0 Picture=Rating_18;Images/Rating/Misc/Rating_18.png;&h33EBBE44;&h1A30CEE4;false;0;&h0 Picture=Rating_PG12;Images/Rating/Misc/Rating_PG-12.png;&h2E8C1EC7;&h1A30CEE4;false;0;&h0 Module=Genre;Modules/Translations/Genre.rbbas;&h2249E31F;&h73420CB;false Picture=IMDbTop250;Images/IMDbTop250.png;&h7BD9509A;&h5510FB7A;false;0;&h0 Class=cvsMovieViewer;Obsolete/cvsMovieViewer.rbbas;&h52205592;&h54E45B12;false Picture=toolbg;Images/toolbg.png;&h48D25003;&h5510FB7A;false;0;&h0 Picture=banneractive;Images/MovieDataTags/banner-active.png;&h17D01334;&h6E81FC20;false;0;&h0 Picture=bannerinactive;Images/MovieDataTags/banner-inactive.png;&h5D9D08C8;&h6E81FC20;false;0;&h0 Picture=bluactive;Images/MovieDataTags/blu-active.png;&h4A6E99E3;&h6E81FC20;false;0;&h0 Picture=bluinactive;Images/MovieDataTags/blu-inactive.png;&h23396DE8;&h6E81FC20;false;0;&h0 Picture=characteractive;Images/MovieDataTags/character-active.png;&h7DB3549A;&h6E81FC20;false;0;&h0 Picture=characterinactive;Images/MovieDataTags/character-inactive.png;&h877CC95;&h6E81FC20;false;0;&h0 Picture=def1080pactive;Images/MovieDataTags/def1080p-active.png;&h30A1334B;&h6E81FC20;false;0;&h0 Picture=def1080pinactive;Images/MovieDataTags/def1080p-inactive.png;&h272EDB84;&h6E81FC20;false;0;&h0 Picture=def720pactive;Images/MovieDataTags/def720p-active.png;&h754E0CDA;&h6E81FC20;false;0;&h0 Picture=def720pinactive;Images/MovieDataTags/def720p-inactive.png;&h572E3A06;&h6E81FC20;false;0;&h0 Picture=defHDactive;Images/MovieDataTags@2x/defHD-active@2x.png;&h1BE3CE47;&h6E81FC20;false;0;&h0 Picture=defHDinactive;Images/MovieDataTags@2x/defHD-inactive@2x.png;&h8FBE745;&h6E81FC20;false;0;&h0 Picture=defSDactive;Images/MovieDataTags/defSD-active.png;&h520CA944;&h6E81FC20;false;0;&h0 Picture=defSDinactive;Images/MovieDataTags/defSD-inactive.png;&h3D3D1B17;&h6E81FC20;false;0;&h0 Picture=discartactive;Images/MovieDataTags/discart-active.png;&h76BDE40F;&h6E81FC20;false;0;&h0 Picture=discartinactive;Images/MovieDataTags/discart-inactive.png;&h2CC81356;&h6E81FC20;false;0;&h0 Picture=DVDactive;Images/MovieDataTags/DVD-active.png;&h779E29C3;&h6E81FC20;false;0;&h0 Picture=DVDinactive;Images/MovieDataTags/DVD-inactive.png;&h30C84035;&h6E81FC20;false;0;&h0 Picture=extrafanartactive;Images/MovieDataTags/extrafanart-active.png;&h3058E619;&h6E81FC20;false;0;&h0 Picture=extrafanartinactive;Images/MovieDataTags/extrafanart-inactive.png;&h1C6ACDC1;&h6E81FC20;false;0;&h0 Picture=extrathumbsactive;Images/MovieDataTags/extrathumbs-active.png;&h43EDA2D4;&h6E81FC20;false;0;&h0 Picture=extrathumbsinactive;Images/MovieDataTags/extrathumbs-inactive.png;&h265D70C9;&h6E81FC20;false;0;&h0 Picture=fanartactive;Images/MovieDataTags/fanart-active.png;&h4A5F7536;&h6E81FC20;false;0;&h0 Picture=fanartinactive;Images/MovieDataTags/fanart-inactive.png;&h41089405;&h6E81FC20;false;0;&h0 Picture=landscapeactive;Images/MovieDataTags/landscape-active.png;&h2527422F;&h6E81FC20;false;0;&h0 Picture=landscapeinactive;Images/MovieDataTags/landscape-inactive.png;&h346A705D;&h6E81FC20;false;0;&h0 Picture=posteractive;Images/MovieDataTags/poster-active.png;&h2C8572E8;&h6E81FC20;false;0;&h0 Picture=posterinactive;Images/MovieDataTags/poster-inactive.png;&h6D3B35D3;&h6E81FC20;false;0;&h0 Picture=subtitlesactive;Images/MovieDataTags/subtitles-active.png;&h2C70373A;&h6E81FC20;false;0;&h0 Picture=subtitlesinactive;Images/MovieDataTags/subtitles-inactive.png;&h7B3A1946;&h6E81FC20;false;0;&h0 Picture=traileractive;Images/MovieDataTags/trailer-active.png;&hC18879B;&h6E81FC20;false;0;&h0 Picture=trailerinactive;Images/MovieDataTags/trailer-inactive.png;&h1E6F18F7;&h6E81FC20;false;0;&h0 Picture=posterbg;Images/posterbg.png;&h7043D0;&h5510FB7A;false;0;&h0 Folder=Metatags;Images/Metatags;&h3C0EB9D;&h5510FB7A;false Picture=metatagsaudioaac;Images/Metatags/metatags-audio-aac.png;&h6EACD3FD;&h3C0EB9D;false;0;&h0 Picture=metatagsaudioac3;Images/Metatags/metatags-audio-ac3.png;&h14920175;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiodts;Images/Metatags/metatags-audio-dts.png;&h7D9DF485;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiomp3;Images/Metatags/metatags-audio-mp3.png;&hD20C9D7;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiompeg;Images/Metatags/metatags-audio-mpeg.png;&h63A38AA2;&h3C0EB9D;false;0;&h0 Picture=metatagschannels;Images/Metatags/metatags-channels.png;&h5E3066F;&h3C0EB9D;false;0;&h0 Picture=metatagsrating;Images/Metatags/metatags-rating.png;&h7BBBA613;&h3C0EB9D;false;0;&h0 Picture=metatagsratio133;Images/Metatags/metatags-ratio-1.33.png;&h5C94AA81;&h3C0EB9D;false;0;&h0 Picture=metatagsratio166;Images/Metatags/metatags-ratio-1.66.png;&h24466C49;&h3C0EB9D;false;0;&h0 Picture=metatagsratio178;Images/Metatags/metatags-ratio-1.78.png;&hB6F80E0;&h3C0EB9D;false;0;&h0 Picture=metatagsratio185;Images/Metatags/metatags-ratio-1.85.png;&h457639A3;&h3C0EB9D;false;0;&h0 Picture=metatagsratio235;Images/Metatags/metatags-ratio-2.35.png;&h54C2619B;&h3C0EB9D;false;0;&h0 Picture=metatagsratio239;Images/Metatags/metatags-ratio-2.39.png;&h2596743C;&h3C0EB9D;false;0;&h0 Picture=metatagsratio240;Images/Metatags/metatags-ratio-2.40.png;&h38A96411;&h3C0EB9D;false;0;&h0 Picture=metatagsratiowidescreen;Images/Metatags/metatags-ratio-widescreen.png;&h78E8F6CC;&h3C0EB9D;false;0;&h0 Picture=metatagsratio;Images/Metatags/metatags-ratio.png;&h6A34ABE;&h3C0EB9D;false;0;&h0 Picture=metatagsvideodivx;Images/Metatags/metatags-video-divx.png;&h4A8044FF;&h3C0EB9D;false;0;&h0 Picture=metatagsvideoh264;Images/Metatags/metatags-video-h264.png;&h2B322935;&h3C0EB9D;false;0;&h0 Picture=metatagsvideompeg;Images/Metatags/metatags-video-mpeg.png;&h6A2FAE60;&h3C0EB9D;false;0;&h0 Picture=metatagsvideoxvid;Images/Metatags/metatags-video-xvid.png;&h606198BC;&h3C0EB9D;false;0;&h0 Picture=metatags;Images/Metatags/metatags.png;&h2772D1B9;&h3C0EB9D;false;0;&h0 Picture=metatagsresolution;Images/Metatags/metatags-resolution.png;&h1D47F471;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiowma;Images/Metatags/metatags-audio-wma.png;&h5F017761;&h3C0EB9D;false;0;&h0 Picture=starring;Images/starring.png;&h1FA75B0D;&h5510FB7A;false;0;&h0 Picture=kw_discrimination;Images/Kijkwijzer/kw_discrimination.png;&h66E592FC;&h18C3ECA5;false;0;&h0 Picture=kw_drugs;Images/Kijkwijzer/kw_drugs.png;&h6A1554D0;&h18C3ECA5;false;0;&h0 Picture=kw_fear;Images/Kijkwijzer/kw_fear.png;&h1E739BBF;&h18C3ECA5;false;0;&h0 Picture=kw_language;Images/Kijkwijzer/kw_language.png;&h37F669DD;&h18C3ECA5;false;0;&h0 Picture=kw_sex;Images/Kijkwijzer/kw_sex.png;&h12A08A85;&h18C3ECA5;false;0;&h0 Picture=kw_violence;Images/Kijkwijzer/kw_violence.png;&h69E66CF6;&h18C3ECA5;false;0;&h0 Folder=tb icons;Images/tb icons;&h16FC0271;&h5510FB7A;false Picture=tb_animeselected;Images/tb icons/tb_anime-selected.png;&h7B049626;&h16FC0271;false;0;&h0 Picture=tb_animeselected2x;Images/tb icons/tb_anime-selected@2x.png;&h6A1E1988;&h16FC0271;false;0;&h0 Picture=tb_anime;Images/tb icons/tb_anime.png;&h5E1EA7CB;&h16FC0271;false;0;&h0 Picture=tb_anime2x;Images/tb icons/tb_anime@2x.png;&h2E9A7259;&h16FC0271;false;0;&h0 Picture=tb_clean;Images/tb icons/tb_clean.png;&h1DC98A9C;&h16FC0271;false;0;&h0 Picture=tb_clean2x;Images/tb icons/tb_clean@2x.png;&h1AAB58B1;&h16FC0271;false;0;&h0 Picture=tb_clean4x;Images/tb icons/tb_clean@4x.png;&h674C1BCA;&h16FC0271;false;0;&h0 Picture=tb_donate;Images/tb icons/tb_donate.png;&h35B4E167;&h16FC0271;false;0;&h0 Picture=tb_donate2x;Images/tb icons/tb_donate@2x.png;&h763A8E62;&h16FC0271;false;0;&h0 Picture=tb_editor;Images/tb icons/tb_editor.png;&h7E5A4237;&h16FC0271;false;0;&h0 Picture=tb_editor2x;Images/tb icons/tb_editor@2x.png;&h57B1AB55;&h16FC0271;false;0;&h0 Picture=tb_extras;Images/tb icons/tb_extras.png;&h5167C813;&h16FC0271;false;0;&h0 Picture=tb_extras2x;Images/tb icons/tb_extras@2x.png;&h7480C2CB;&h16FC0271;false;0;&h0 Picture=tb_fetch;Images/tb icons/tb_fetch.png;&h31751AD4;&h16FC0271;false;0;&h0 Picture=tb_fetch2x;Images/tb icons/tb_fetch@2x.png;&h7F34AF4F;&h16FC0271;false;0;&h0 Picture=tb_fetchall;Images/tb icons/tb_fetchall.png;&h5BE1EE6D;&h16FC0271;false;0;&h0 Picture=tb_fetchall2x;Images/tb icons/tb_fetchall@2x.png;&h4DECA6E1;&h16FC0271;false;0;&h0 Picture=tb_metaimagesselected;Images/tb icons/tb_metaimages-selected.png;&h6BC06764;&h16FC0271;false;0;&h0 Picture=tb_metaimagesselected2x;Images/tb icons/tb_metaimages-selected@2x.png;&h24C44F26;&h16FC0271;false;0;&h0 Picture=tb_metaimages;Images/tb icons/tb_metaimages.png;&h54289C4B;&h16FC0271;false;0;&h0 Picture=tb_metaimages2x;Images/tb icons/tb_metaimages@2x.png;&h362D6CBD;&h16FC0271;false;0;&h0 Picture=tb_metainfoselected;Images/tb icons/tb_metainfo-selected.png;&h603E49BA;&h16FC0271;false;0;&h0 Picture=tb_metainfoselected2x;Images/tb icons/tb_metainfo-selected@2x.png;&h195AC559;&h16FC0271;false;0;&h0 Picture=tb_metainfo;Images/tb icons/tb_metainfo.png;&h1652A4B6;&h16FC0271;false;0;&h0 Picture=tb_metainfo2x;Images/tb icons/tb_metainfo@2x.png;&hBBBF5D3;&h16FC0271;false;0;&h0 Picture=tb_metapeopleselected;Images/tb icons/tb_metapeople-selected.png;&h6108374F;&h16FC0271;false;0;&h0 Picture=tb_metapeopleselected2x;Images/tb icons/tb_metapeople-selected@2x.png;&h626796F3;&h16FC0271;false;0;&h0 Picture=tb_metapeople;Images/tb icons/tb_metapeople.png;&h7EE79FA3;&h16FC0271;false;0;&h0 Picture=tb_metapeople2x;Images/tb icons/tb_metapeople@2x.png;&h18A20912;&h16FC0271;false;0;&h0 Picture=tb_metarecmoviesselected;Images/tb icons/tb_metarecmovies-selected.png;&h3601CB06;&h16FC0271;false;0;&h0 Picture=tb_metarecmoviesselected2x;Images/tb icons/tb_metarecmovies-selected@2x.png;&h2FB85443;&h16FC0271;false;0;&h0 Picture=tb_metarecmovies;Images/tb icons/tb_metarecmovies.png;&h6EA454D4;&h16FC0271;false;0;&h0 Picture=tb_metarecmovies2x;Images/tb icons/tb_metarecmovies@2x.png;&h66BDA4B1;&h16FC0271;false;0;&h0 Picture=tb_metasummaryselected;Images/tb icons/tb_metasummary-selected.png;&h2C87D6CF;&h16FC0271;false;0;&h0 Picture=tb_metasummaryselected2x;Images/tb icons/tb_metasummary-selected@2x.png;&hA280886;&h16FC0271;false;0;&h0 Picture=tb_metasummary;Images/tb icons/tb_metasummary.png;&h4A47DC45;&h16FC0271;false;0;&h0 Picture=tb_metasummary2x;Images/tb icons/tb_metasummary@2x.png;&h33CE9DC2;&h16FC0271;false;0;&h0 Picture=tb_metatrailersselected;Images/tb icons/tb_metatrailers-selected.png;&h41D787C6;&h16FC0271;false;0;&h0 Picture=tb_metatrailersselected2x;Images/tb icons/tb_metatrailers-selected@2x.png;&h2D133B95;&h16FC0271;false;0;&h0 Picture=tb_metatrailers;Images/tb icons/tb_metatrailers.png;&h49AD0BF7;&h16FC0271;false;0;&h0 Picture=tb_metatrailers2x;Images/tb icons/tb_metatrailers@2x.png;&h7FECEC90;&h16FC0271;false;0;&h0 Picture=tb_moviesselected;Images/tb icons/tb_movies-selected.png;&h1B9F6533;&h16FC0271;false;0;&h0 Picture=tb_moviesselected2x;Images/tb icons/tb_movies-selected@2x.png;&h7DAD4715;&h16FC0271;false;0;&h0 Picture=tb_movies;Images/tb icons/tb_movies.png;&h7B1635CE;&h16FC0271;false;0;&h0 Picture=tb_movies2x;Images/tb icons/tb_movies@2x.png;&h6F26E829;&h16FC0271;false;0;&h0 Picture=tb_prefssettingsselected2x;Images/tb icons/tb_prefssettings-selected@2x.png;&h63545667;&h16FC0271;false;0;&h0 Picture=tb_prefssettings2x;Images/tb icons/tb_prefssettings@2x.png;&h35F4F8C9;&h16FC0271;false;0;&h0 Picture=tb_prefsupdatesselected;Images/tb icons/tb_prefsupdates-selected.png;&h65F9B171;&h16FC0271;false;0;&h0 Picture=tb_prefsupdatesselected2x;Images/tb icons/tb_prefsupdates-selected@2x.png;&h6BF0E7AA;&h16FC0271;false;0;&h0 Picture=tb_prefsupdates;Images/tb icons/tb_prefsupdates.png;&h14F9C2E9;&h16FC0271;false;0;&h0 Picture=tb_prefsupdates2x;Images/tb icons/tb_prefsupdates@2x.png;&h196B9B67;&h16FC0271;false;0;&h0 Picture=tb_refresh;Images/tb icons/tb_refresh.png;&h67A7D5E0;&h16FC0271;false;0;&h0 Picture=tb_refresh2x;Images/tb icons/tb_refresh@2x.png;&h3BCADBF0;&h16FC0271;false;0;&h0 Picture=tb_search;Images/tb icons/tb_search.png;&h32DC9E1;&h16FC0271;false;0;&h0 Picture=tb_search2x;Images/tb icons/tb_search@2x.png;&h3321160E;&h16FC0271;false;0;&h0 Picture=tb_setsmanager;Images/tb icons/tb_setsmanager.png;&h412F4D01;&h16FC0271;false;0;&h0 Picture=tb_setsmanager2x;Images/tb icons/tb_setsmanager@2x.png;&h868DFBC;&h16FC0271;false;0;&h0 Picture=tb_televisionselected;Images/tb icons/tb_television-selected.png;&h1D38F59A;&h16FC0271;false;0;&h0 Picture=tb_televisionselected2x;Images/tb icons/tb_television-selected@2x.png;&h684A219;&h16FC0271;false;0;&h0 Picture=tb_television;Images/tb icons/tb_television.png;&h6DAE5C4C;&h16FC0271;false;0;&h0 Picture=tb_television2x;Images/tb icons/tb_television@2x.png;&h522DFB7B;&h16FC0271;false;0;&h0 Picture=traileractive2x;Images/MovieDataTags@2x/trailer-active@2x.png;&h2D94B1EA;&h62FA8680;false;0;&h0 Picture=trailerinactive2x;Images/MovieDataTags@2x/trailer-inactive@2x.png;&h7D2CD2AC;&h62FA8680;false;0;&h0 Picture=posteractive2x;Images/MovieDataTags@2x/poster-active@2x.png;&h10CB0DC4;&h62FA8680;false;0;&h0 Picture=posterinactive2x;Images/MovieDataTags@2x/poster-inactive@2x.png;&h2F5091F;&h62FA8680;false;0;&h0 Picture=fanartactive2x;Images/MovieDataTags@2x/fanart-active@2x.png;&h2BF24148;&h62FA8680;false;0;&h0 Picture=fanartinactive2x;Images/MovieDataTags@2x/fanart-inactive@2x.png;&h2D9C3628;&h62FA8680;false;0;&h0 Picture=landscapeactive2x;Images/MovieDataTags@2x/landscape-active@2x.png;&h5793104B;&h62FA8680;false;0;&h0 Picture=landscapeinactive2x;Images/MovieDataTags@2x/landscape-inactive@2x.png;&h78131A7D;&h62FA8680;false;0;&h0 Picture=discartactive2x;Images/MovieDataTags@2x/discart-active@2x.png;&h28CABE21;&h62FA8680;false;0;&h0 Picture=discartinactive2x;Images/MovieDataTags@2x/discart-inactive@2x.png;&h1688BF19;&h62FA8680;false;0;&h0 Picture=subtitlesactive2x;Images/MovieDataTags@2x/subtitles-active@2x.png;&h66EC5A4B;&h62FA8680;false;0;&h0 Picture=subtitlesinactive2x;Images/MovieDataTags@2x/subtitles-inactive@2x.png;&h271C685D;&h62FA8680;false;0;&h0 Picture=banneractive2x;Images/MovieDataTags@2x/banner-active@2x.png;&h35F30D61;&h62FA8680;false;0;&h0 Picture=bannerinactive2x;Images/MovieDataTags@2x/banner-inactive@2x.png;&h67F3B898;&h62FA8680;false;0;&h0 Picture=characteractive2x;Images/MovieDataTags@2x/character-active@2x.png;&h1893AF5;&h62FA8680;false;0;&h0 Picture=characterinactive2x;Images/MovieDataTags@2x/character-inactive@2x.png;&h587DED42;&h62FA8680;false;0;&h0 Picture=extrafanartactive2x;Images/MovieDataTags@2x/extrafanart-active@2x.png;&h1BE98F45;&h62FA8680;false;0;&h0 Picture=extrafanartinactive2x;Images/MovieDataTags@2x/extrafanart-inactive@2x.png;&h2BD4AFA;&h62FA8680;false;0;&h0 Picture=extrathumbsactive2x;Images/MovieDataTags@2x/extrathumbs-active@2x.png;&h3C541952;&h62FA8680;false;0;&h0 Picture=extrathumbsinactive2x;Images/MovieDataTags@2x/extrathumbs-inactive@2x.png;&h354AB715;&h62FA8680;false;0;&h0 Picture=bluactive2x;Images/MovieDataTags@2x/blu-active@2x.png;&h28567BBE;&h62FA8680;false;0;&h0 Picture=bluinactive2x;Images/MovieDataTags@2x/blu-inactive@2x.png;&h45D64D48;&h62FA8680;false;0;&h0 Picture=def720pactive2x;Images/MovieDataTags@2x/def720p-active@2x.png;&h2887F88;&h62FA8680;false;0;&h0 Picture=def720pinactive2x;Images/MovieDataTags@2x/def720p-inactive@2x.png;&h4F6CFCAA;&h62FA8680;false;0;&h0 Picture=def1080pactive2x;Images/MovieDataTags@2x/def1080p-active@2x.png;&h7C406748;&h62FA8680;false;0;&h0 Picture=def1080pinactive2x;Images/MovieDataTags@2x/def1080p-inactive@2x.png;&h683D2958;&h62FA8680;false;0;&h0 Picture=defSDactive2x;Images/MovieDataTags@2x/defSD-active@2x.png;&h765C785;&h62FA8680;false;0;&h0 Picture=defSDinactive2x;Images/MovieDataTags@2x/defSD-inactive@2x.png;&h2B0E3234;&h62FA8680;false;0;&h0 Picture=DVDactive2x;Images/MovieDataTags@2x/DVD-active@2x.png;&h31024BA7;&h62FA8680;false;0;&h0 Picture=DVDinactive2x;Images/MovieDataTags@2x/DVD-inactive@2x.png;&hDB51BBA;&h62FA8680;false;0;&h0 Picture=defHDactive2x;Images/MovieDataTags@2x/defHD-active@2x.png;&h737D3572;&h62FA8680;false;0;&h0 Picture=defHDinactive2x;Images/MovieDataTags@2x/defHD-inactive@2x.png;&h21404C40;&h62FA8680;false;0;&h0 Picture=logoactive;Images/MovieDataTags/logo-active.png;&h6264E29D;&h6E81FC20;false;0;&h0 Picture=logoinactive;Images/MovieDataTags/logo-inactive.png;&h4D5A2588;&h6E81FC20;false;0;&h0 Picture=logoactive2x;Images/MovieDataTags@2x/logo-active@2x.png;&h1203789D;&h62FA8680;false;0;&h0 Picture=logoinactive2x;Images/MovieDataTags@2x/logo-inactive@2x.png;&h21E3D64E;&h62FA8680;false;0;&h0 Picture=clearartactive2x;Images/MovieDataTags@2x/clearart-active@2x.png;&h62C9C85A;&h62FA8680;false;0;&h0 Picture=clearartinactive2x;Images/MovieDataTags@2x/clearart-inactive@2x.png;&h2D810107;&h62FA8680;false;0;&h0 Picture=clearartactive;Images/MovieDataTags/clearart-active.png;&h1E254C6F;&h6E81FC20;false;0;&h0 Picture=clearartinactive;Images/MovieDataTags/clearart-inactive.png;&h22BD5C85;&h6E81FC20;false;0;&h0 Picture=ToolUpdate2x;Images/Toolbar Icons/ToolUpdate@2x.png;&h467CC39E;&h1CB3421F;false;0;&h0 Class=SearchList;Classes/SearchList.rbbas;&h480A12D2;&h61F91BC9;false Class=MediaDetails;Classes/MediaDetails.rbbas;&hD59FF97;&h61F91BC9;false Picture=tb_experimental;Images/tb icons/tb_experimental.png;&h1353974E;&h16FC0271;false;0;&h0 Picture=tb_experimental2x;Images/tb icons/tb_experimental@2x.png;&h54F2CD71;&h16FC0271;false;0;&h0 Folder=Movie Section;Windows/Movie Section;&h582E392D;&h5241B183;false Folder=TV Show Section;Windows/TV Show Section;&h4650B3D8;&h5241B183;false Window=wndMovieMetadata;Windows/Movie Section/wndMovieMetadata.rbfrm;&h3EF6DC8E;&h582E392D;false Window=wndSetManager;Windows/Movie Section/wndSetManager.rbfrm;&h837F6DF;&h582E392D;false Folder=Utility;Windows/Utility;&h42AC283B;&h5241B183;false Window=wndMessage;Windows/Utility/wndMessage.rbfrm;&h3F1C5E0C;&h42AC283B;false Window=wndRenameTags;Windows/Utility/wndRenameTags.rbfrm;&h5AD7E270;&h42AC283B;false Window=wndClean;Windows/Utility/wndClean.rbfrm;&h11DB8F1D;&h42AC283B;false Window=wndPreviewThumbs;Windows/Utility/wndPreviewThumbs.rbfrm;&h2E0557B2;&h42AC283B;false Window=wndResults;Windows/Utility/wndResults.rbfrm;&h3C525B;&h42AC283B;false Window=wndSearch;Windows/Utility/wndSearch.rbfrm;&h389F5D97;&h42AC283B;false Class=PushbuttonPro;Classes/PushbuttonPro.rbbas;&h5487E28A;&h61F91BC9;false Module=URLCore;CoreServices/URLCore.rbbas;&h6E7FA88D;&h18E3FCD2;false Picture=miniconmovieII;Images/minicon-movieII.png;&h7FE3A230;&h5510FB7A;false;0;&h0 Picture=miniconmovieII2x;Images/minicon-movieII@2x.png;&h39AD808E;&h5510FB7A;false;0;&h0 Picture=bookmark;Images/bookmark.png;&h8D8CEE3;&h5510FB7A;false;0;&h0 Window=wndStatus;Windows/Utility/wndStatus.rbfrm;&h499CADE5;&h42AC283B;false Module=IMDb;Modules/IMDb.rbbas;&h5CC5625B;&h298F9D05;false Window=wndShowMetadata;Windows/TV Show Section/wndShowMetadata.rbfrm;&h5C4F8F9E;&h4650B3D8;false Window=wndEpisodeManager;Windows/TV Show Section/wndEpisodeManager.rbfrm;&h7A8E33D6;&h4650B3D8;false Window=wndAdvancedSettings;Obsolete/wndAdvancedSettings.rbfrm;&h6C1CC6C9;&h54E45B12;false Picture=tb_episodes;Images/tb icons/tb_episodes.png;&h67D8866F;&h16FC0271;false;0;&h0 Picture=tb_episodes2x;Images/tb icons/tb_episodes@2x.png;&h38625852;&h16FC0271;false;0;&h0 Folder=Status;Images/Status;&h3D93657B;&h5510FB7A;false Picture=status_announced2x;Images/Status/status_announced@2x.png;&h17EBCF78;&h3D93657B;false;0;&h0 Picture=status_bubble2x;Images/Status/status_bubble@2x.png;&h7A821D32;&h3D93657B;false;0;&h0 Picture=status_development2x;Images/Status/status_development@2x.png;&h744B3E19;&h3D93657B;false;0;&h0 Picture=status_ended2x;Images/Status/status_ended@2x.png;&h77DA589A;&h3D93657B;false;0;&h0 Picture=status_final2x;Images/Status/status_final@2x.png;&h1FEF6595;&h3D93657B;false;0;&h0 Picture=status_hiatus2x;Images/Status/status_hiatus@2x.png;&h1DF66B3A;&h3D93657B;false;0;&h0 Picture=status_month2x;Images/Status/status_month@2x.png;&h1CF9FDDA;&h3D93657B;false;0;&h0 Picture=status_newseries2x;Images/Status/status_newseries@2x.png;&h608943B8;&h3D93657B;false;0;&h0 Picture=status_pilot2x;Images/Status/status_pilot@2x.png;&h53BD5831;&h3D93657B;false;0;&h0 Picture=status_today2x;Images/Status/status_today@2x.png;&h33E96590;&h3D93657B;false;0;&h0 Picture=status_unknown2x;Images/Status/status_unknown@2x.png;&h200B2D36;&h3D93657B;false;0;&h0 Picture=status_upcoming2x;Images/Status/status_upcoming@2x.png;&h3DC5864F;&h3D93657B;false;0;&h0 Picture=status_week2x;Images/Status/status_week@2x.png;&h72F50DDD;&h3D93657B;false;0;&h0 Class=HierListBox;Classes/HierListBox.rbbas;&h56AA3EC2;&h61F91BC9;false Picture=Snowman;Images/Snowman.png;&h50A5A331;&h5510FB7A;false;0;&h0 Picture=JackOLantern;Images/JackOLantern.png;&h2A7D50FA;&h5510FB7A;false;0;&h0 Module=HTMLTemplate;Modules/HTMLTemplate.rbbas;&h73F1E5F4;&h298F9D05;false Window=wndHTMLExporter;Windows/Utility/wndHTMLExporter.rbfrm;&h39DF2D0;&h42AC283B;false RawData=credits;Resources/credits.html;&h2C249D77;&h23881057;false Picture=bannerplaceholder;Images/banner-placeholder.png;&h1D15192C;&h5510FB7A;false;0;&h0 Picture=episodethumbplaceholder;Images/episodethumb-placeholder.jpg;&h7BBE102E;&h5510FB7A;false;0;&h0 Picture=themesongactive;Images/MovieDataTags/themesong-active@.png;&h24F6DC64;&h6E81FC20;false;0;&h0 Picture=themesonginactive;Images/MovieDataTags/themesong-inactive@.png;&h4AFF7DD7;&h6E81FC20;false;0;&h0 Picture=themesongactive2x;Images/MovieDataTags@2x/themesong-active@2x.png;&h4B9F165E;&h62FA8680;false;0;&h0 Picture=themesonginactive2x;Images/MovieDataTags@2x/themesong-inactive@2x.png;&h3975DDC1;&h62FA8680;false;0;&h0 Picture=tb_themesongselected;Images/tb icons/tb_themesong-selected.png;&h69320905;&h16FC0271;false;0;&h0 Picture=tb_themesongselected2x;Images/tb icons/tb_themesong-selected@2x.png;&h53EE9EDD;&h16FC0271;false;0;&h0 Picture=tb_themesong;Images/tb icons/tb_themesong.png;&h57002BDD;&h16FC0271;false;0;&h0 Picture=tb_themesong2x;Images/tb icons/tb_themesong@2x.png;&h4C402870;&h16FC0271;false;0;&h0 Module=Encrypted;MBSSerial.rbo;&h2348E93;&h298F9D05;false Picture=unwatched;Images/Status/unwatched.png;&h4D761B7F;&h3D93657B;false;0;&h0 Picture=watched;Images/Status/watched.png;&h507983A;&h3D93657B;false;0;&h0 Window=wndItemChooser;Windows/Utility/wndItemChooser.rbfrm;&h44CFBEE4;&h42AC283B;false Window=dlgInput;Windows/Utility/dlgInput.rbfrm;&h4EEA6A01;&h42AC283B;false Picture=metatagsaudiotruehd;Images/Metatags/metatags-audio-truehd.png;&h181CCA05;&h3C0EB9D;false;0;&h0 Picture=dropdown;Images/dropdown.png;&h7E8563F2;&h5510FB7A;false;0;&h0 Class=Class1;Classes/Class1.rbbas;&h4521C52;&h61F91BC9;false Class=NotificationCenter;Modules/nc/NotificationCenter.rbbas;&h6FE325D0;&h4AA84F20;false Window=wndBugReporter;Windows/Utility/wndBugReporter.rbfrm;&h7079BB95;&h42AC283B;false Folder=Global Methods;Modules/Global Methods;&h2C545099;&h298F9D05;false Module=Globals;Modules/Global Methods/Globals.rbbas;&h3257C1DE;&h2C545099;false Module=PaintBucket;Modules/Global Methods/PaintBucket.rbbas;&h1F79314A;&h2C545099;false Module=PrettyXML;Modules/Global Methods/PrettyXML.rbbas;&h56509CF7;&h2C545099;false Module=LionFullScreen;Modules/Global Methods/LionFullScreen.rbbas;&h7656292;&h2C545099;false Picture=hdtvactive;Images/MovieDataTags/hdtv-active.png;&h4426BEB0;&h6E81FC20;false;0;&h0 Picture=hdtvinactive;Images/MovieDataTags/hdtv-inactive.png;&h4BB1796A;&h6E81FC20;false;0;&h0 Picture=hdtvactive2x;Images/MovieDataTags@2x/hdtv-active@2x.png;&h709A869E;&h62FA8680;false;0;&h0 Picture=hdtvinactive2x;Images/MovieDataTags@2x/hdtv-inactive@2x.png;&h30FC6A79;&h62FA8680;false;0;&h0 Module=AppearanceManager;Modules/macoslib/AppearanceManager.rbbas;&h71493042;&h3CAB55D;false Module=AppleEvents;Modules/macoslib/AppleEvents.rbbas;&h7BFFB8CE;&h3CAB55D;false Module=ATSForFonts;Modules/macoslib/ATSForFonts/ATSForFonts.rbbas;&h51BE5DA1;&h3CAB55D;false Module=CertTools;Modules/macoslib/CertTools.rbbas;&h28F5609A;&h3CAB55D;false Module=Cocoa;Modules/macoslib/Cocoa/Cocoa.rbbas;&h599751E;&h3CAB55D;false Folder=Cocoa Extensions;Modules/macoslib/Cocoa Extensions;&h1DD84917;&h3CAB55D;false Folder=Cocoa MenuItems;Modules/macoslib/Cocoa MenuItems;&h62A6D5F5;&h3CAB55D;false Folder=Cocoa Notifications;Modules/macoslib/Cocoa Notifications;&h37293C12;&h3CAB55D;false Module=CocoaToolbar;Modules/macoslib/CocoaToolbar/CocoaToolbar.rbbas;&h74271FAE;&h3CAB55D;false Module=ControlManager;Modules/macoslib/ControlManager.rbbas;&h349155BB;&h3CAB55D;false Module=Carbon;Modules/macoslib/Carbon/Carbon.rbbas;&h3193C499;&h3CAB55D;false Module=CarbonEvents;Modules/macoslib/CarbonEvents.rbbas;&h5C5073E2;&h3CAB55D;false Folder=Controls;Modules/macoslib/Controls;&h25E86B6D;&h3CAB55D;false Module=CFArrayExtension;Modules/macoslib/CFArrayExtension.rbbas;&h3DE51632;&h3CAB55D;false Module=CoreFoundation;Modules/macoslib/CoreFoundation/CoreFoundation.rbbas;&hB148E03;&h3CAB55D;false Module=CoreGraphics;Modules/macoslib/CoreGraphics/CoreGraphics.rbbas;&h7277AE49;&h3CAB55D;false Module=CoreText;Modules/macoslib/CoreText/CoreText.rbbas;&hF53B6FB;&h3CAB55D;false Module=FileManager;Modules/macoslib/FileManager/FileManager.rbbas;&h4112623F;&h3CAB55D;false Module=FolderManager;Modules/macoslib/FolderManager.rbbas;&h1DF0791F;&h3CAB55D;false Class=FourCharCode;Modules/macoslib/FourCharCode.rbbas;&h16A0333A;&h3CAB55D;false Module=IOKit;Modules/macoslib/IOKit/IOKit.rbbas;&h6F837216;&h3CAB55D;false Module=KeychainServices;Modules/macoslib/KeychainServices/KeychainServices.rbbas;&h1EB77D32;&h3CAB55D;false Module=LaunchServices;Modules/macoslib/LaunchServices.rbbas;&h207CAF05;&h3CAB55D;false Folder=MacIcon Classes;Modules/macoslib/MacIcon Classes;&h59C6C392;&h3CAB55D;false Class=MacOSError;Modules/macoslib/MacOSError.rbbas;&h85215F0;&h3CAB55D;false Module=NavigationServices;Modules/macoslib/NavigationServices/NavigationServices.rbbas;&h451E857A;&h3CAB55D;false Module=ProcessManager;Modules/macoslib/ProcessManager/ProcessManager.rbbas;&h56CD71AF;&h3CAB55D;false Module=QTKit;Modules/macoslib/QTKit/QTKit.rbbas;&h49E30654;&h3CAB55D;false Module=Spotlight;Modules/macoslib/Spotlight/Spotlight.rbbas;&h57B4DC57;&h3CAB55D;false Module=SystemConfiguration;Modules/macoslib/SystemConfiguration/SystemConfiguration.rbbas;&h22EE4263;&h3CAB55D;false Module=WindowManager;Modules/macoslib/WindowManager/WindowManager.rbbas;&h4848C525;&h3CAB55D;false Class=Tuple;Modules/macoslib/Tuple.rbbas;&h218766DC;&h3CAB55D;false Class=UTI;Modules/macoslib/UTI.rbbas;&h4072485C;&h3CAB55D;false Class=MacTCPSocket;Modules/macoslib/MacTCPSocket.rbbas;&hEECF2B8;&h3CAB55D;false Folder=Convenience extensions and objects;Modules/macoslib/Convenience extensions and objects;&h66335755;&h3CAB55D;false Module=AttachedPropertiesModule;Modules/macoslib/AttachedPropertiesModule.rbbas;&h34AB0384;&h3CAB55D;false Class=ATSFont;Modules/macoslib/ATSForFonts/ATSFont.rbbas;&h47742BC5;&h51BE5DA1;false Class=ATSFontFamily;Modules/macoslib/ATSForFonts/ATSFontFamily.rbbas;&h1BE5F8CF;&h51BE5DA1;false Class=AutoreleaseTimer;Modules/macoslib/Cocoa/AutoreleaseTimer.rbbas;&h17322DFE;&h599751E;false Class=CIContext;Modules/macoslib/Cocoa/CIContext.rbbas;&h5F69CC3D;&h599751E;false Class=CIImage;Modules/macoslib/Cocoa/CIImage.rbbas;&h1AE02B61;&h599751E;false Class=CocoaDelegate;Modules/macoslib/Cocoa/CocoaDelegate.rbbas;&h73403CB5;&h599751E;false Class=CocoaUnregisteredClassException;Modules/macoslib/Cocoa/CocoaUnregisteredClassException.rbbas;&h7E520BD5;&h599751E;false Class=CocoaUnregisteredSelectorException;Modules/macoslib/Cocoa/CocoaUnregisteredSelectorException.rbbas;&h3C874F63;&h599751E;false Class=NSActionCell;Modules/macoslib/Cocoa/NSActionCell.rbbas;&h576D4D46;&h599751E;false Class=NSAffineTransform;Modules/macoslib/Cocoa/NSAffineTransform.rbbas;&h48EC9D27;&h599751E;false Class=NSApplication;Modules/macoslib/Cocoa/NSApplication.rbbas;&h2641D27E;&h599751E;false Class=NSArray;Modules/macoslib/Cocoa/NSArray.rbbas;&h2B62A377;&h599751E;false Class=NSAttributedString;Modules/macoslib/Cocoa/NSAttributedString.rbbas;&h58DA3187;&h599751E;false Class=NSAutoreleasePool;Modules/macoslib/Cocoa/NSAutoreleasePool.rbbas;&h5CEA0549;&h599751E;false Class=NSBezierPath;Modules/macoslib/Cocoa/NSBezierPath.rbbas;&h8016CED;&h599751E;false Class=NSBitmapImageRep;Modules/macoslib/Cocoa/NSBitmapImageRep.rbbas;&h1596815C;&h599751E;false Class=NSBundle;Modules/macoslib/Cocoa/NSBundle.rbbas;&h4C070BBC;&h599751E;false Class=NSButtonCell;Modules/macoslib/Cocoa/NSButtonCell.rbbas;&h6293CC48;&h599751E;false Class=NSCalendar;Modules/macoslib/Cocoa/NSCalendar.rbbas;&h5548FF2D;&h599751E;false Class=NSCell;Modules/macoslib/Cocoa/NSCell.rbbas;&h2B6950BF;&h599751E;false Class=NSCharacterSet;Modules/macoslib/Cocoa/NSCharacterSet.rbbas;&hF348383;&h599751E;false Class=NSColor;Modules/macoslib/Cocoa/NSColor.rbbas;&h40A656E7;&h599751E;false Class=NSColorspace;Modules/macoslib/Cocoa/NSColorspace.rbbas;&h6893BA7F;&h599751E;false Class=NSColorWell;Modules/macoslib/Cocoa/NSColorWell.rbbas;&h3AB95F22;&h599751E;false Class=NSConnection;Modules/macoslib/Cocoa/NSConnection.rbbas;&h601510F2;&h599751E;false Class=NSControl;Modules/macoslib/Cocoa/NSControl.rbbas;&h70BF2CC;&h599751E;false Class=NSCountedSet;Modules/macoslib/Cocoa/NSCountedSet.rbbas;&h21717457;&h599751E;false Class=NSData;Modules/macoslib/Cocoa/NSData.rbbas;&h1F8D4E8E;&h599751E;false Class=NSDate;Modules/macoslib/Cocoa/NSDate.rbbas;&h76209E76;&h599751E;false Class=NSDateComponents;Modules/macoslib/Cocoa/NSDateComponents.rbbas;&h5783D336;&h599751E;false Class=NSDateFormatter;Modules/macoslib/Cocoa/NSDateFormatter.rbbas;&hF9FECC3;&h599751E;false Class=NSDatePicker;Modules/macoslib/Cocoa/NSDatePicker.rbbas;&h4C713FDE;&h599751E;false Class=NSDictionary;Modules/macoslib/Cocoa/NSDictionary.rbbas;&h1F1870AD;&h599751E;false Class=NSDistributedNotificationCenter;Modules/macoslib/Cocoa/NSDistributedNotificationCenter.rbbas;&h7D8DBF73;&h599751E;false Class=NSDockTile;Modules/macoslib/Cocoa/NSDockTile.rbbas;&h65149910;&h599751E;false Class=NSDocument;Modules/macoslib/Cocoa/NSDocument.rbbas;&h2B4D5EEE;&h599751E;false Class=NSDrawer;Modules/macoslib/Cocoa/NSDrawer.rbbas;&h6493B31D;&h599751E;false Class=NSEnumerator;Modules/macoslib/Cocoa/NSEnumerator.rbbas;&h1CD4AA27;&h599751E;false Class=NSError;Modules/macoslib/Cocoa/NSError.rbbas;&h4DEF36E0;&h599751E;false Class=NSEvent;Modules/macoslib/Cocoa/NSEvent.rbbas;&h13FC15BF;&h599751E;false Class=NSException;Modules/macoslib/Cocoa/NSException.rbbas;&hAF7FA7F;&h599751E;false Class=NSFileWrapper;Modules/macoslib/Cocoa/NSFileWrapper.rbbas;&h1E5EEF1F;&h599751E;false Class=NSFont;Modules/macoslib/Cocoa/NSFont.rbbas;&h6AA52D72;&h599751E;false Class=NSFontDescriptor;Modules/macoslib/Cocoa/NSFontDescriptor.rbbas;&h24B0FB7;&h599751E;false Class=NSFontManager;Modules/macoslib/Cocoa/NSFontManager.rbbas;&hDF4FA34;&h599751E;false Class=NSGraphicsContext;Modules/macoslib/Cocoa/NSGraphicsContext.rbbas;&h4E56B4BA;&h599751E;false Class=NSHost;Modules/macoslib/Cocoa/NSHost.rbbas;&h1E73892A;&h599751E;false Class=NSImage;Modules/macoslib/Cocoa/NSImage.rbbas;&h333275AA;&h599751E;false Class=NSImageRep;Modules/macoslib/Cocoa/NSImageRep.rbbas;&h35CB47CE;&h599751E;false Class=NSIndexSet;Modules/macoslib/Cocoa/NSIndexSet.rbbas;&h34D7829F;&h599751E;false Class=NSLayoutConstraint;Modules/macoslib/Cocoa/NSLayoutConstraint.rbbas;&h30C0F179;&h599751E;false Class=NSLayoutManager;Modules/macoslib/Cocoa/NSLayoutManager.rbbas;&h4B2D9996;&h599751E;false Class=NSLevelIndicator;Modules/macoslib/Cocoa/NSLevelIndicator.rbbas;&h1EBEAF0F;&h599751E;false Class=NSLocale;Modules/macoslib/Cocoa/NSLocale.rbbas;&h78D75333;&h599751E;false Class=NSMenu;Modules/macoslib/Cocoa/NSMenu.rbbas;&h97B8E6;&h599751E;false Class=NSMenuItem;Modules/macoslib/Cocoa/NSMenuItem.rbbas;&h68EC45FD;&h599751E;false Class=NSMutableArray;Modules/macoslib/Cocoa/NSMutableArray.rbbas;&h6FE75C81;&h599751E;false Class=NSMutableCharacterSet;Modules/macoslib/Cocoa/NSMutableCharacterSet.rbbas;&h3E6A9432;&h599751E;false Class=NSMutableData;Modules/macoslib/Cocoa/NSMutableData.rbbas;&h4727C047;&h599751E;false Class=NSMutableDictionary;Modules/macoslib/Cocoa/NSMutableDictionary.rbbas;&h2C0DB76;&h599751E;false Class=NSMutableIndexSet;Modules/macoslib/Cocoa/NSMutableIndexSet.rbbas;&h43886309;&h599751E;false Class=NSMutableSet;Modules/macoslib/Cocoa/NSMutableSet.rbbas;&h2F1E4828;&h599751E;false Class=NSMutableString;Modules/macoslib/Cocoa/NSMutableString.rbbas;&h6D1393E8;&h599751E;false Class=NSNotification;Modules/macoslib/Cocoa/NSNotification.rbbas;&h2053DDF0;&h599751E;false Class=NSNotificationCenter;Modules/macoslib/Cocoa/NSNotificationCenter.rbbas;&h621009CA;&h599751E;false Class=NSNull;Modules/macoslib/Cocoa/NSNull.rbbas;&hAF320B8;&h599751E;false Class=NSNumber;Modules/macoslib/Cocoa/NSNumber.rbbas;&h5FE9574B;&h599751E;false Class=NSObject;Modules/macoslib/Cocoa/NSObject.rbbas;&h50626FC4;&h599751E;false Class=NSObjectRBWrapper;Modules/macoslib/Cocoa/NSObjectRBWrapper.rbbas;&h6E9817BC;&h599751E;false Class=NSPasteboard;Modules/macoslib/Cocoa/NSPasteboard.rbbas;&h433EB203;&h599751E;false Class=NSPasteboardItem;Modules/macoslib/Cocoa/NSPasteboardItem.rbbas;&h49194718;&h599751E;false Class=NSPathComponentCell;Modules/macoslib/Cocoa/NSPathComponentCell.rbbas;&h1A8ADFCC;&h599751E;false Class=NSPathControl;Modules/macoslib/Cocoa/NSPathControl.rbbas;&h136B1957;&h599751E;false Class=NSPopupButton;Modules/macoslib/Cocoa/NSPopupButton.rbbas;&h5C4CEA5C;&h599751E;false Class=NSPort;Modules/macoslib/Cocoa/NSPort.rbbas;&h3DAEAF01;&h599751E;false Class=NSPredicate;Modules/macoslib/Cocoa/NSPredicate.rbbas;&h1763CBF0;&h599751E;false Class=NSPrinter;Modules/macoslib/Cocoa/NSPrinter.rbbas;&h18E24735;&h599751E;false Class=NSRunLoop;Modules/macoslib/Cocoa/NSRunLoop.rbbas;&h2FB136FC;&h599751E;false Class=NSProcessInfo;Modules/macoslib/Cocoa/NSProcessInfo.rbbas;&h1B913480;&h599751E;false Class=NSSearchField;Modules/macoslib/Cocoa/NSSearchField.rbbas;&h5A0E0F49;&h599751E;false Class=NSSlider;Modules/macoslib/Cocoa/NSSlider.rbbas;&h510DF175;&h599751E;false Class=NSStatusBar;Modules/macoslib/Cocoa/NSStatusBar.rbbas;&h6A67A38B;&h599751E;false Class=NSStatusItem;Modules/macoslib/Cocoa/NSStatusItem.rbbas;&h3A2272E6;&h599751E;false Class=NSStepper;Modules/macoslib/Cocoa/NSStepper.rbbas;&h2BA5B981;&h599751E;false Class=NSString;Modules/macoslib/Cocoa/NSString.rbbas;&hD361C30;&h599751E;false Class=NSResponder;Modules/macoslib/Cocoa/NSResponder.rbbas;&h5B74DBBC;&h599751E;false Class=NSRunningApplication;Modules/macoslib/Cocoa/NSRunningApplication.rbbas;&h55068432;&h599751E;false Class=NSScreen;Modules/macoslib/Cocoa/NSScreen.rbbas;&h1ED15BE0;&h599751E;false Class=NSSet;Modules/macoslib/Cocoa/NSSet.rbbas;&h42E72094;&h599751E;false Class=NSTableColumn;Modules/macoslib/Cocoa/NSTableColumn.rbbas;&h540C3882;&h599751E;false Class=NSTableHeaderView;Modules/macoslib/Cocoa/NSTableHeaderView.rbbas;&h6E524B8F;&h599751E;false Class=NSTableView;Modules/macoslib/Cocoa/NSTableView.rbbas;&h5CDF1384;&h599751E;false Class=NSTableViewDataSource;Modules/macoslib/Cocoa/NSTableViewDataSource.rbbas;&h397AB064;&h599751E;false Class=NSText;Modules/macoslib/Cocoa/NSText.rbbas;&h25D2D45D;&h599751E;false Class=NSTextAttachment;Modules/macoslib/Cocoa/NSTextAttachment.rbbas;&h34747AB7;&h599751E;false Class=NSTextBlock;Modules/macoslib/Cocoa/NSTextBlock.rbbas;&h4B24E0EE;&h599751E;false Class=NSTextContainer;Modules/macoslib/Cocoa/NSTextContainer.rbbas;&h622B9172;&h599751E;false Class=NSTextList;Modules/macoslib/Cocoa/NSTextList.rbbas;&h1A5A475E;&h599751E;false Class=NSTextTable;Modules/macoslib/Cocoa/NSTextTable.rbbas;&h1D03BB7C;&h599751E;false Class=NSTextTableBlock;Modules/macoslib/Cocoa/NSTextTableBlock.rbbas;&h600A1A6B;&h599751E;false Class=NSTimer;Modules/macoslib/Cocoa/NSTimer.rbbas;&h374CD9B5;&h599751E;false Class=NSTimeZone;Modules/macoslib/Cocoa/NSTimeZone.rbbas;&h16695816;&h599751E;false Class=NSTokenField;Modules/macoslib/Cocoa/NSTokenField.rbbas;&h5E16597E;&h599751E;false Class=NSURL;Modules/macoslib/Cocoa/NSURL.rbbas;&hD4DD11A;&h599751E;false Class=NSValue;Modules/macoslib/Cocoa/NSValue.rbbas;&h6FDB4A6E;&h599751E;false Class=NSView;Modules/macoslib/Cocoa/NSView.rbbas;&h25F3F6C7;&h599751E;false Class=NSWindow;Modules/macoslib/Cocoa/NSWindow.rbbas;&h33CED7EE;&h599751E;false Class=NSWorkspace;Modules/macoslib/Cocoa/NSWorkspace.rbbas;&h50C2A67A;&h599751E;false Interface=VariantValueInterface;Modules/macoslib/Cocoa/VariantValueInterface.rbbas;&h1B3FFEA8;&h599751E;false Interface=NSPasteboardWriting;Modules/macoslib/Cocoa/NSPasteboardWriting.rbbas;&h6681738;&h599751E;false Module=ComboBoxExtension;Modules/macoslib/Cocoa Extensions/ComboBoxExtension.rbbas;&h1BCCA277;&h1DD84917;false Module=ControlExtension;Modules/macoslib/Cocoa Extensions/ControlExtension.rbbas;&h17BE8289;&h1DD84917;false Module=GroupBoxExtensions;Modules/macoslib/Cocoa Extensions/GroupBoxExtensions.rbbas;&h5C6C3E32;&h1DD84917;false Module=HTMLViewerExtension;Modules/macoslib/Cocoa Extensions/HTMLViewerExtension.rbbas;&h4667B5AB;&h1DD84917;false Module=PopupMenuExtension;Modules/macoslib/Cocoa Extensions/PopupMenuExtension.rbbas;&h42C8534F;&h1DD84917;false Module=ProgressBarExtension;Modules/macoslib/Cocoa Extensions/ProgressBarExtension.rbbas;&h6DD5CB6F;&h1DD84917;false Module=ProgressWheelExtension;Modules/macoslib/Cocoa Extensions/ProgressWheelExtension.rbbas;&h6F1F5E64;&h1DD84917;false Module=PushButtonExtension;Modules/macoslib/Cocoa Extensions/PushButtonExtension.rbbas;&h746E71E0;&h1DD84917;false Module=SegmentedControlExtension;Modules/macoslib/Cocoa Extensions/SegmentedControlExtension.rbbas;&h7EF6A67D;&h1DD84917;false Module=SliderExtension;Modules/macoslib/Cocoa Extensions/SliderExtension.rbbas;&h732CDB4F;&h1DD84917;false Module=TabPanelExtension;Modules/macoslib/Cocoa Extensions/TabPanelExtension.rbbas;&h5F29C42;&h1DD84917;false Module=TextAreaExtension;Modules/macoslib/Cocoa Extensions/TextAreaExtension.rbbas;&h7AF0F5C0;&h1DD84917;false Module=TextFieldExtension;Modules/macoslib/Cocoa Extensions/TextFieldExtension.rbbas;&h619690F4;&h1DD84917;false Class=CocoaMenuItem;Modules/macoslib/Cocoa MenuItems/CocoaMenuItem.rbbas;&h6406F6DF;&h62A6D5F5;false Class=CocoaMenuItemSupermenu;Modules/macoslib/Cocoa MenuItems/CocoaMenuItemSupermenu.rbbas;&h53A1F6D;&h62A6D5F5;false Class=CocoaMenuItemToggle;Modules/macoslib/Cocoa MenuItems/CocoaMenuItemToggle.rbbas;&h2AE5716F;&h62A6D5F5;false Folder=File Menu;Modules/macoslib/Cocoa MenuItems/File Menu;&h3D7A860F;&h62A6D5F5;false Folder=Edit Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu;&h36F7A3F7;&h62A6D5F5;false Folder=Format Menu;Modules/macoslib/Cocoa MenuItems/Format Menu;&h3C2E0AF8;&h62A6D5F5;false Folder=View Menu;Modules/macoslib/Cocoa MenuItems/View Menu;&h72D2804B;&h62A6D5F5;false Folder=Window Menu;Modules/macoslib/Cocoa MenuItems/Window Menu;&h59E53877;&h62A6D5F5;false Class=NSNotificationObserver;Modules/macoslib/Cocoa Notifications/NSNotificationObserver.rbbas;&h57DE7C62;&h37293C12;false Interface=NSNotificationInterface;Modules/macoslib/Cocoa Notifications/NSNotificationInterface.rbbas;&h4FB874A5;&h37293C12;false Class=NSApplicationNotificationObserver;Modules/macoslib/Cocoa Notifications/NSApplicationNotificationObserver.rbbas;&h56F2672C;&h37293C12;false Interface=NSApplicationNotificationInterface;Modules/macoslib/Cocoa Notifications/NSApplicationNotificationInterface.rbbas;&h4453E7F2;&h37293C12;false Class=NSTimeZoneNotificationObserver;Modules/macoslib/Cocoa Notifications/NSTimeZoneNotificationObserver.rbbas;&h60A1258F;&h37293C12;false Interface=NSTimeZoneNotificationInterface;Modules/macoslib/Cocoa Notifications/NSTimeZoneNotificationInterface.rbbas;&h73A9427E;&h37293C12;false Class=NSWindowNotificationObserver;Modules/macoslib/Cocoa Notifications/NSWindowNotificationObserver.rbbas;&h6D4CDB2A;&h37293C12;false Interface=NSWindowNotificationInterface;Modules/macoslib/Cocoa Notifications/NSWindowNotificationInterface.rbbas;&h50C91C1B;&h37293C12;false Class=NSWorkspaceNotificationObserver;Modules/macoslib/Cocoa Notifications/NSWorkspaceNotificationObserver.rbbas;&h43549BB2;&h37293C12;false Interface=NSWorkspaceNotificationInterface;Modules/macoslib/Cocoa Notifications/NSWorkspaceNotificationInterface.rbbas;&h67BA274C;&h37293C12;false Class=NSDistributedNotificationsObserver;Modules/macoslib/Cocoa Notifications/NSDistributedNotificationsObserver.rbbas;&h6E6A656D;&h37293C12;false Interface=NSDistributedNotificationsInterface;Modules/macoslib/Cocoa Notifications/NSDistributedNotificationsInterface.rbbas;&hB295163;&h37293C12;false Class=NSToolbar;Modules/macoslib/CocoaToolbar/NSToolbar.rbbas;&h459E81F4;&h74271FAE;false Class=NSToolbarItem;Modules/macoslib/CocoaToolbar/NSToolbarItem.rbbas;&h29661F87;&h74271FAE;false Interface=NSToolbarItemInterface;Modules/macoslib/CocoaToolbar/NSToolbarItemInterface.rbbas;&h6FA02EF2;&h74271FAE;false Class=NSToolbarButtonItem;Modules/macoslib/CocoaToolbar/NSToolbarButtonItem.rbbas;&h7D6A8CC4;&h74271FAE;false Class=NSToolbarCustomItem;Modules/macoslib/CocoaToolbar/NSToolbarCustomItem.rbbas;&h5E4019D5;&h74271FAE;false Class=NSToolbarDropMenuItem;Modules/macoslib/CocoaToolbar/NSToolbarDropMenuItem.rbbas;&h426060F0;&h74271FAE;false Class=CarbonPasteboard;Modules/macoslib/Carbon/CarbonPasteboard.rbbas;&h457C9041;&h3193C499;false Class=MacCheckbox;Modules/macoslib/Controls/MacCheckbox.rbbas;&h74E300B0;&h25E86B6D;false Class=MacDatePicker;Modules/macoslib/Controls/MacDatePicker.rbbas;&h6342A069;&h25E86B6D;false Class=HISearchField;Modules/macoslib/Controls/HISearchField.rbbas;&h2B31C20E;&h25E86B6D;false Class=MacMenu;Modules/macoslib/Controls/MacMenu.rbbas;&h4FBB7CEF;&h25E86B6D;false Class=CFArray;Modules/macoslib/CoreFoundation/CFArray.rbbas;&h1E079974;&hB148E03;false Class=CFBoolean;Modules/macoslib/CoreFoundation/CFBoolean.rbbas;&h4EBDFB9;&hB148E03;false Class=CFBundle;Modules/macoslib/CoreFoundation/CFBundle.rbbas;&h19AD2EDB;&hB148E03;false Class=CFCalendar;Modules/macoslib/CoreFoundation/CFCalendar.rbbas;&h38DF7AAE;&hB148E03;false Class=CFCharacterSet;Modules/macoslib/CoreFoundation/CFCharacterSet.rbbas;&h57EF9453;&hB148E03;false Class=CFData;Modules/macoslib/CoreFoundation/CFData.rbbas;&h31F343E5;&hB148E03;false Class=CFDate;Modules/macoslib/CoreFoundation/CFDate.rbbas;&h59EECAA7;&hB148E03;false Class=CFError;Modules/macoslib/CoreFoundation/CFError.rbbas;&h4C3B09B7;&hB148E03;false Class=CFDictionary;Modules/macoslib/CoreFoundation/CFDictionary.rbbas;&h37FB3620;&hB148E03;false Class=CFMutableArray;Modules/macoslib/CoreFoundation/CFMutableArray.rbbas;&h4D9ECD3C;&hB148E03;false Class=CFMutableData;Modules/macoslib/CoreFoundation/CFMutableData.rbbas;&h74B48799;&hB148E03;false Class=CFMutableDictionary;Modules/macoslib/CoreFoundation/CFMutableDictionary.rbbas;&h7832CB50;&hB148E03;false Class=CFMutableSet;Modules/macoslib/CoreFoundation/CFMutableSet.rbbas;&h4EC2707C;&hB148E03;false Class=CFMutableString;Modules/macoslib/CoreFoundation/CFMutableString.rbbas;&h3F6746EF;&hB148E03;false Class=CFNotificationCenter;Modules/macoslib/CoreFoundation/CFNotificationCenter.rbbas;&h15625714;&hB148E03;false Class=CFLocale;Modules/macoslib/CoreFoundation/CFLocale.rbbas;&h6B432EA9;&hB148E03;false Class=CFNumber;Modules/macoslib/CoreFoundation/CFNumber.rbbas;&h7ACD1E9;&hB148E03;false Class=CFNull;Modules/macoslib/CoreFoundation/CFNull.rbbas;&h63095D94;&hB148E03;false Class=CFPreferences;Modules/macoslib/CoreFoundation/CFPreferences.rbbas;&h7BDF13FD;&hB148E03;false Class=CFReadStream;Modules/macoslib/CoreFoundation/CFReadStream.rbbas;&h7299C839;&hB148E03;false Class=CFRunLoop;Modules/macoslib/CoreFoundation/CFRunLoop.rbbas;&h4E28929C;&hB148E03;false Class=CFRunLoopSource;Modules/macoslib/CoreFoundation/CFRunLoopSource.rbbas;&h49B1A980;&hB148E03;false Class=CFRunLoopTimer;Modules/macoslib/CoreFoundation/CFRunLoopTimer.rbbas;&h2EEF79F2;&hB148E03;false Class=CFSet;Modules/macoslib/CoreFoundation/CFSet.rbbas;&h6C2F5896;&hB148E03;false Class=CFSocket;Modules/macoslib/CoreFoundation/CFSocket.rbbas;&h186158FD;&hB148E03;false Class=CFSocketSignature;Modules/macoslib/CoreFoundation/CFSocketSignature.rbbas;&h1F199832;&hB148E03;false Class=CFStream;Modules/macoslib/CoreFoundation/CFStream.rbbas;&h49574C37;&hB148E03;false Class=CFString;Modules/macoslib/CoreFoundation/CFString.rbbas;&h24D1625;&hB148E03;false Class=CFStringTokenizer;Modules/macoslib/CoreFoundation/CFStringTokenizer.rbbas;&h12E919F7;&hB148E03;false Class=CFTimeZone;Modules/macoslib/CoreFoundation/CFTimeZone.rbbas;&h5A7F27A;&hB148E03;false Class=CFType;Modules/macoslib/CoreFoundation/CFType.rbbas;&h55206C22;&hB148E03;false Class=CFURL;Modules/macoslib/CoreFoundation/CFURL.rbbas;&h439B997D;&hB148E03;false Class=CFWriteStream;Modules/macoslib/CoreFoundation/CFWriteStream.rbbas;&h1C7A41DE;&hB148E03;false Interface=CFPropertyList;Modules/macoslib/CoreFoundation/CFPropertyList.rbbas;&h1E7AA613;&hB148E03;false Class=CGBitmapContext;Modules/macoslib/CoreGraphics/CGBitmapContext.rbbas;&h62D7AAD;&h7277AE49;false Class=CGContext;Modules/macoslib/CoreGraphics/CGContext.rbbas;&h13D138AC;&h7277AE49;false Class=CGContextGraphicsPort;Modules/macoslib/CoreGraphics/CGContextGraphicsPort.rbbas;&hCDFF004;&h7277AE49;false Class=CGColorSpace;Modules/macoslib/CoreGraphics/CGColorSpace.rbbas;&h4206DEDC;&h7277AE49;false Class=CGColor;Modules/macoslib/CoreGraphics/CGColor.rbbas;&h5111A107;&h7277AE49;false Class=CGDataConsumer;Modules/macoslib/CoreGraphics/CGDataConsumer.rbbas;&h5C633DCB;&h7277AE49;false Class=CGDataProvider;Modules/macoslib/CoreGraphics/CGDataProvider.rbbas;&h776E4B75;&h7277AE49;false Class=CGFont;Modules/macoslib/CoreGraphics/CGFont.rbbas;&h6A1C6D3A;&h7277AE49;false Class=CGFunction;Modules/macoslib/CoreGraphics/CGFunction.rbbas;&h704772E8;&h7277AE49;false Class=CGImage;Modules/macoslib/CoreGraphics/CGImage.rbbas;&h62C95894;&h7277AE49;false Class=CGImageDestination;Modules/macoslib/CoreGraphics/CGImageDestination.rbbas;&h10D6D0DD;&h7277AE49;false Class=CGImageSource;Modules/macoslib/CoreGraphics/CGImageSource.rbbas;&h72AA774;&h7277AE49;false Class=CGMutablePath;Modules/macoslib/CoreGraphics/CGMutablePath.rbbas;&h157F5FF;&h7277AE49;false Class=CGPath;Modules/macoslib/CoreGraphics/CGPath.rbbas;&h35D77AAF;&h7277AE49;false Class=CGPattern;Modules/macoslib/CoreGraphics/CGPattern.rbbas;&h55B7D46C;&h7277AE49;false Class=CGPDFArray;Modules/macoslib/CoreGraphics/CGPDFArray.rbbas;&h17DB6C11;&h7277AE49;false Class=CGPDFBoolean;Modules/macoslib/CoreGraphics/CGPDFBoolean.rbbas;&h46941DF9;&h7277AE49;false Class=CGPDFDictionary;Modules/macoslib/CoreGraphics/CGPDFDictionary.rbbas;&h263C2C48;&h7277AE49;false Class=CGPDFDocument;Modules/macoslib/CoreGraphics/CGPDFDocument.rbbas;&h387F803A;&h7277AE49;false Class=CGPDFObject;Modules/macoslib/CoreGraphics/CGPDFObject.rbbas;&h3ABBBE76;&h7277AE49;false Class=CGPDFStream;Modules/macoslib/CoreGraphics/CGPDFStream.rbbas;&h7BD594BF;&h7277AE49;false Class=CGPDFPage;Modules/macoslib/CoreGraphics/CGPDFPage.rbbas;&h31908C3;&h7277AE49;false Class=CGShading;Modules/macoslib/CoreGraphics/CGShading.rbbas;&h608E7D71;&h7277AE49;false Class=CTFont;Modules/macoslib/CoreText/CTFont.rbbas;&h2ACDF8E3;&hF53B6FB;false Class=FSIterator;Modules/macoslib/FileManager/FSIterator.rbbas;&h388F56AF;&h4112623F;false Class=FSRef;Modules/macoslib/FileManager/FSRef.rbbas;&h4A8459D1;&h4112623F;false Class=ExternalPowerAdapter;Modules/macoslib/IOKit/ExternalPowerAdapter.rbbas;&h37251035;&h6F837216;false Class=PowerSource;Modules/macoslib/IOKit/PowerSource.rbbas;&h624B6581;&h6F837216;false Class=Keychain;Modules/macoslib/KeychainServices/Keychain.rbbas;&h43F56C37;&h1EB77D32;false Class=KeychainItem;Modules/macoslib/KeychainServices/KeychainItem.rbbas;&h2593F362;&h1EB77D32;false Class=Error;Modules/macoslib/KeychainServices/Error.rbbas;&h144FFBDA;&h1EB77D32;false Class=MacIcon;Modules/macoslib/MacIcon Classes/MacIcon.rbbas;&hF1FF147;&h59C6C392;false Class=NavigationDialog;Modules/macoslib/NavigationServices/NavigationDialog.rbbas;&h7A19B5B8;&h451E857A;false Class=AskDiscardChangesDialog;Modules/macoslib/NavigationServices/AskDiscardChangesDialog.rbbas;&h2DE9C34E;&h451E857A;false Class=AskReviewDocumentsDialog;Modules/macoslib/NavigationServices/AskReviewDocumentsDialog.rbbas;&h4E158F14;&h451E857A;false Class=AskSaveChangesDialog;Modules/macoslib/NavigationServices/AskSaveChangesDialog.rbbas;&h6964D3BE;&h451E857A;false Class=ChooseFileDialog;Modules/macoslib/NavigationServices/ChooseFileDialog.rbbas;&h5A89D6A6;&h451E857A;false Class=ChooseFolderDialog;Modules/macoslib/NavigationServices/ChooseFolderDialog.rbbas;&hF6B9C60;&h451E857A;false Class=CreateNewFolderDialog;Modules/macoslib/NavigationServices/CreateNewFolderDialog.rbbas;&h61E7AC2E;&h451E857A;false Class=ChooseObjectDialog;Modules/macoslib/NavigationServices/ChooseObjectDialog.rbbas;&h30D973DF;&h451E857A;false Class=ChooseVolumeDialog;Modules/macoslib/NavigationServices/ChooseVolumeDialog.rbbas;&h1446902D;&h451E857A;false Class=ControlKind;Modules/macoslib/NavigationServices/ControlKind.rbbas;&h24A3C667;&h451E857A;false Class=GetFileDialog;Modules/macoslib/NavigationServices/GetFileDialog.rbbas;&h7C36E8A1;&h451E857A;false Class=PutFileDialog;Modules/macoslib/NavigationServices/PutFileDialog.rbbas;&h78E32362;&h451E857A;false Class=NavDialogCreationOptions;Modules/macoslib/NavigationServices/NavDialogCreationOptions.rbbas;&h8287695;&h451E857A;false Class=Process;Modules/macoslib/ProcessManager/Process.rbbas;&h18817608;&h56CD71AF;false Class=QTCaptureConnection;Modules/macoslib/QTKit/QTCaptureConnection.rbbas;&h5B6C556F;&h49E30654;false Class=QTCaptureDevice;Modules/macoslib/QTKit/QTCaptureDevice.rbbas;&h255D5AF3;&h49E30654;false Class=QTCaptureDeviceInput;Modules/macoslib/QTKit/QTCaptureDeviceInput.rbbas;&h13FE5C55;&h49E30654;false Class=QTCaptureSession;Modules/macoslib/QTKit/QTCaptureSession.rbbas;&h20601C5A;&h49E30654;false Class=QTCaptureView;Modules/macoslib/QTKit/QTCaptureView.rbbas;&h5E5AAF7;&h49E30654;false Class=QTMedia;Modules/macoslib/QTKit/QTMedia.rbbas;&h293B82CD;&h49E30654;false Class=QTMovie;Modules/macoslib/QTKit/QTMovie.rbbas;&h208B787;&h49E30654;false Class=QTMovieView;Modules/macoslib/QTKit/QTMovieView.rbbas;&hA4942C2;&h49E30654;false Class=MDQuery;Modules/macoslib/Spotlight/MDQuery.rbbas;&h4FBE157A;&h57B4DC57;false Class=MDItem;Modules/macoslib/Spotlight/MDItem.rbbas;&h48746722;&h57B4DC57;false Class=SCDynamicStore;Modules/macoslib/SystemConfiguration/SCDynamicStore.rbbas;&h521F4FFD;&h22EE4263;false Class=SCNetworkInterface;Modules/macoslib/SystemConfiguration/SCNetworkInterface.rbbas;&h5BCD6D0;&h22EE4263;false Class=SCNetworkReachability;Modules/macoslib/SystemConfiguration/SCNetworkReachability.rbbas;&h30BB3647;&h22EE4263;false Class=WindowGroup;Modules/macoslib/WindowManager/WindowGroup.rbbas;&h52E8C9F5;&h4848C525;false Module=MacOSFolderItemExtension;Modules/macoslib/Convenience extensions and objects/MacOSFolderItemExtension.rbbas;&h31235FFF;&h66335755;false Module=UnicodeFormsExtension;Modules/macoslib/Convenience extensions and objects/UnicodeFormsExtension.rbbas;&h973B933;&h66335755;false Module=StringExtension;Modules/macoslib/Convenience extensions and objects/StringExtension.rbbas;&hC8409C4;&h66335755;false Module=SystemIcons;Modules/macoslib/Convenience extensions and objects/SystemIcons.rbbas;&h309D6AED;&h66335755;false Module=ExtendedAttributesExtensions;Modules/macoslib/Convenience extensions and objects/ExtendedAttributesExtensions.rbbas;&h2ED74830;&h66335755;false Module=ApplicationExtensions;Modules/macoslib/Convenience extensions and objects/ApplicationExtensions.rbbas;&h37C4A0FC;&h66335755;false Module=SystemExtensions;Modules/macoslib/Convenience extensions and objects/SystemExtensions.rbbas;&h4E255EA4;&h66335755;false Module=IntrospectionExtensions;Modules/macoslib/Convenience extensions and objects/IntrospectionExtensions.rbbas;&h7768CAB6;&h66335755;false Folder=Pasteboard reading and writing;Modules/macoslib/Convenience extensions and objects/Pasteboard reading and writing;&hD4F19F;&h66335755;false Class=MenuItemFileMenu;Modules/macoslib/Cocoa MenuItems/File Menu/MenuItemFileMenu.rbbas;&h1C433FCC;&h3D7A860F;false Class=CocoaMenuItemClose;Modules/macoslib/Cocoa MenuItems/File Menu/CocoaMenuItemClose.rbbas;&h311BA39;&h3D7A860F;false Class=CocoaMenuItemPrint;Modules/macoslib/Cocoa MenuItems/File Menu/CocoaMenuItemPrint.rbbas;&hD93768;&h3D7A860F;false Class=CocoaMenuItemPageSetup;Modules/macoslib/Cocoa MenuItems/File Menu/CocoaMenuItemPageSetup.rbbas;&h34C4CEED;&h3D7A860F;false Class=MenuItemEditMenu;Modules/macoslib/Cocoa MenuItems/Edit Menu/MenuItemEditMenu.rbbas;&h64ED8651;&h36F7A3F7;false Class=CocoaMenuItemUndo;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemUndo.rbbas;&h260DA541;&h36F7A3F7;false Class=CocoaMenuItemRedo;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemRedo.rbbas;&h49DCA391;&h36F7A3F7;false Class=CocoaMenuItemCut;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemCut.rbbas;&h3476EC1F;&h36F7A3F7;false Class=CocoaMenuItemCopy;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemCopy.rbbas;&h6B8843C7;&h36F7A3F7;false Class=CocoaMenuItemPaste;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemPaste.rbbas;&h3F1A369E;&h36F7A3F7;false Class=CocoaMenuItemPasteAndMatchStyle;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemPasteAndMatchStyle.rbbas;&h51F82115;&h36F7A3F7;false Class=CocoaMenuItemDelete;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemDelete.rbbas;&h79445563;&h36F7A3F7;false Class=CocoaMenuItemComplete;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemComplete.rbbas;&h7542566D;&h36F7A3F7;false Class=CocoaMenuItemSelectAll;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemSelectAll.rbbas;&h56388BE5;&h36F7A3F7;false Folder=Edit.Insert Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu;&h1A68D542;&h36F7A3F7;false Class=CocoaMenuItemEditLink;Modules/macoslib/Cocoa MenuItems/Edit Menu/CocoaMenuItemEditLink.rbbas;&h58892F3F;&h36F7A3F7;false Folder=Edit.Find Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu;&h167D4028;&h36F7A3F7;false Folder=Edit.Spelling Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu;&h78FF4F46;&h36F7A3F7;false Folder=Edit.Substitutions Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu;&h41ADFC5F;&h36F7A3F7;false Folder=Edit.Transformations Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu;&h594244F;&h36F7A3F7;false Folder=Edit.Speech Menu;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Speech Menu;&h40DC030B;&h36F7A3F7;false Class=MenuItemFormatMenu;Modules/macoslib/Cocoa MenuItems/Format Menu/MenuItemFormatMenu.rbbas;&h2C4C2A17;&h3C2E0AF8;false Folder=Format.Font Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu;&h3C5FA45F;&h3C2E0AF8;false Folder=Format.Text Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu;&h2B20B996;&h3C2E0AF8;false Class=CocoaMenuItemList;Modules/macoslib/Cocoa MenuItems/Format Menu/CocoaMenuItemList.rbbas;&h71787E9E;&h3C2E0AF8;false Class=CocoaMenuItemTable;Modules/macoslib/Cocoa MenuItems/Format Menu/CocoaMenuItemTable.rbbas;&h1DC132EB;&h3C2E0AF8;false Class=MenuItemViewMenu;Modules/macoslib/Cocoa MenuItems/View Menu/MenuItemViewMenu.rbbas;&h76F63335;&h72D2804B;false Class=CocoaMenuItemShowToolbar;Modules/macoslib/Cocoa MenuItems/View Menu/CocoaMenuItemShowToolbar.rbbas;&h1D9C5B3D;&h72D2804B;false Class=CocoaMenuItemCustomizeToolbar;Modules/macoslib/Cocoa MenuItems/View Menu/CocoaMenuItemCustomizeToolbar.rbbas;&h42A52A1;&h72D2804B;false Class=MenuItemWindowMenu;Modules/macoslib/Cocoa MenuItems/Window Menu/MenuItemWindowMenu.rbbas;&h76970BCF;&h59E53877;false Class=MenuItemBringAllToFront;Modules/macoslib/Cocoa MenuItems/Window Menu/MenuItemBringAllToFront.rbbas;&h3688C182;&h59E53877;false Class=MenuItemMinimize;Modules/macoslib/Cocoa MenuItems/Window Menu/MenuItemMinimize.rbbas;&h4C589B6C;&h59E53877;false Class=MenuItemZoom;Modules/macoslib/Cocoa MenuItems/Window Menu/MenuItemZoom.rbbas;&h4D443842;&h59E53877;false Interface=PasteboardReadingAndWriting;Modules/macoslib/Convenience extensions and objects/Pasteboard reading and writing/PasteboardReadingAndWriting.rbbas;&h39C9DE55;&hD4F19F;false Module=PasteboardReadingAndWritingModule;Modules/macoslib/Convenience extensions and objects/Pasteboard reading and writing/PasteboardReadingAndWritingModule.rbbas;&h7423FDBC;&hD4F19F;false Class=CocoaMenuItemInsert;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu/CocoaMenuItemInsert.rbbas;&h66E7BEDB;&h1A68D542;false Class=CocoaMenuItemInsertParagraphBreak;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu/CocoaMenuItemInsertParagraphBreak.rbbas;&h78A3924A;&h1A68D542;false Class=CocoaMenuItemInsertLineBreak;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu/CocoaMenuItemInsertLineBreak.rbbas;&h3AD9B7CC;&h1A68D542;false Class=CocoaMenuItemInsertPageBreak;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Insert Menu/CocoaMenuItemInsertPageBreak.rbbas;&h2BB211E9;&h1A68D542;false Class=CocoaMenuItemFindParent;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFindParent.rbbas;&h37B6300E;&h167D4028;false Class=CocoaMenuItemFindAbstract;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFindAbstract.rbbas;&h1A0D455B;&h167D4028;false Class=CocoaMenuItemFind;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFind.rbbas;&h5D44A85F;&h167D4028;false Class=CocoaMenuItemFindNext;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFindNext.rbbas;&h468A6675;&h167D4028;false Class=CocoaMenuItemFindPrevious;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemFindPrevious.rbbas;&h284CF127;&h167D4028;false Class=CocoaMenuItemUseSelectionForFind;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemUseSelectionForFind.rbbas;&h536C8DC2;&h167D4028;false Class=CocoaMenuItemJumpToSelection;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemJumpToSelection.rbbas;&h7BCF27FD;&h167D4028;false Class=CocoaMenuItemSelectLine;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Find Menu/CocoaMenuItemSelectLine.rbbas;&h5D4AD431;&h167D4028;false Class=CocoaMenuItemEditSpelling;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemEditSpelling.rbbas;&h5BB14E76;&h78FF4F46;false Class=CocoaMenuItemShowSpelling;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemShowSpelling.rbbas;&h559695A7;&h78FF4F46;false Class=CocoaMenuItemCheckDocumentNow;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemCheckDocumentNow.rbbas;&h113B747D;&h78FF4F46;false Class=CocoaMenuItemCheckGrammarWithSpelling;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemCheckGrammarWithSpelling.rbbas;&h565D0507;&h78FF4F46;false Class=CocoaMenuItemCheckSpellingWhileTyping;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemCheckSpellingWhileTyping.rbbas;&h74F57C82;&h78FF4F46;false Class=CocoaMenuItemCorrectSpelling;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Spelling Menu/CocoaMenuItemCorrectSpelling.rbbas;&h20C1B871;&h78FF4F46;false Class=CocoaMenuItemEditSubstitutions;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemEditSubstitutions.rbbas;&hE34552A;&h41ADFC5F;false Class=CocoaMenuItemShowSubstitutions;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemShowSubstitutions.rbbas;&hDC38155;&h41ADFC5F;false Class=CocoaMenuItemSmartCopyPaste;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemSmartCopyPaste.rbbas;&h1E603C28;&h41ADFC5F;false Class=CocoaMenuItemSmartQuotes;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemSmartQuotes.rbbas;&h400DB752;&h41ADFC5F;false Class=CocoaMenuItemSmartDashes;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemSmartDashes.rbbas;&h447ECAFE;&h41ADFC5F;false Class=CocoaMenuItemSmartLinks;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemSmartLinks.rbbas;&h60414E79;&h41ADFC5F;false Class=CocoaMenuItemDataDetectors;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemDataDetectors.rbbas;&h5F875CF3;&h41ADFC5F;false Class=CocoaMenuItemTextReplacement;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Substitutions Menu/CocoaMenuItemTextReplacement.rbbas;&h2FE7C82A;&h41ADFC5F;false Class=CocoaMenuItemEditTransformations;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu/CocoaMenuItemEditTransformations.rbbas;&h1A06979E;&h594244F;false Class=CocoaMenuItemMakeUppercase;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu/CocoaMenuItemMakeUppercase.rbbas;&h26CC5511;&h594244F;false Class=CocoaMenuItemMakeLowercase;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu/CocoaMenuItemMakeLowercase.rbbas;&h30E524A3;&h594244F;false Class=CocoaMenuItemCapitalize;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Transformations Menu/CocoaMenuItemCapitalize.rbbas;&h13C8A40F;&h594244F;false Class=CocoaMenuItemEditSpeech;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Speech Menu/CocoaMenuItemEditSpeech.rbbas;&h598B2094;&h40DC030B;false Class=CocoaMenuItemStartSpeaking;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Speech Menu/CocoaMenuItemStartSpeaking.rbbas;&h3D08441F;&h40DC030B;false Class=CocoaMenuItemStopSpeaking;Modules/macoslib/Cocoa MenuItems/Edit Menu/Edit.Speech Menu/CocoaMenuItemStopSpeaking.rbbas;&h69B0B02C;&h40DC030B;false Class=CocoaMenuItemFormatFont;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatFont.rbbas;&h4EFE908F;&h3C5FA45F;false Class=CocoaMenuItemFormatFontTrait;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatFontTrait.rbbas;&h2AC50673;&h3C5FA45F;false Class=CocoaMenuItemShowFonts;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemShowFonts.rbbas;&h6D2ABF9A;&h3C5FA45F;false Class=CocoaMenuItemFormatBold;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatBold.rbbas;&h1189911A;&h3C5FA45F;false Class=CocoaMenuItemFormatItalic;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatItalic.rbbas;&h5E958C9A;&h3C5FA45F;false Class=CocoaMenuItemFormatUnderline;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatUnderline.rbbas;&h2C42449F;&h3C5FA45F;false Class=CocoaMenuItemFormatOutline;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFormatOutline.rbbas;&h32A77B12;&h3C5FA45F;false Class=CocoaMenuItemFontStyles;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemFontStyles.rbbas;&h1181365F;&h3C5FA45F;false Class=CocoaMenuItemModifyFont;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemModifyFont.rbbas;&h3A18E199;&h3C5FA45F;false Class=CocoaMenuItemBigger;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemBigger.rbbas;&h37836341;&h3C5FA45F;false Class=CocoaMenuItemSmaller;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemSmaller.rbbas;&h12E99E86;&h3C5FA45F;false Folder=Format.Font.Kern Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu;&h27A6BAC3;&h3C5FA45F;false Folder=Format.Font.Ligature Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu;&h332FAE31;&h3C5FA45F;false Folder=Format.Font.Baseline Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu;&h7F556EDD;&h3C5FA45F;false Folder=Format.Font.CharacterShape Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.CharacterShape Menu;&h41E1F220;&h3C5FA45F;false Class=CocoaMenuItemShowColors;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemShowColors.rbbas;&h58DF7650;&h3C5FA45F;false Class=CocoaMenuItemCopyStyle;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemCopyStyle.rbbas;&h36D0ED6B;&h3C5FA45F;false Class=CocoaMenuItemPasteStyle;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/CocoaMenuItemPasteStyle.rbbas;&h4E936990;&h3C5FA45F;false Class=CocoaMenuItemFormatText;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemFormatText.rbbas;&h2FF7D6E3;&h2B20B996;false Class=CocoaMenuItemTextAlignLeft;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemTextAlignLeft.rbbas;&h383D2B55;&h2B20B996;false Class=CocoaMenuItemTextCenter;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemTextCenter.rbbas;&h37E837F1;&h2B20B996;false Class=CocoaMenuItemTextJustify;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemTextJustify.rbbas;&h6EB10D89;&h2B20B996;false Class=CocoaMenuItemTextAlignRight;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemTextAlignRight.rbbas;&h29F017CB;&h2B20B996;false Folder=Format.Text.WritingDirection Menu;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu;&h51AA6795;&h2B20B996;false Class=CocoaMenuItemShowRuler;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemShowRuler.rbbas;&hA76D2BC;&h2B20B996;false Class=CocoaMenuItemCopyRuler;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemCopyRuler.rbbas;&h7F057BA7;&h2B20B996;false Class=CocoaMenuItemPasteRuler;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemPasteRuler.rbbas;&h40F993BD;&h2B20B996;false Class=CocoaMenuItemSpacing;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/CocoaMenuItemSpacing.rbbas;&h4152C044;&h2B20B996;false Class=CocoaMenuItemFormatFontKern;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemFormatFontKern.rbbas;&h1FCD1383;&h27A6BAC3;false Class=CocoaMenuItemKernDefault;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemKernDefault.rbbas;&h50BC4F6A;&h27A6BAC3;false Class=CocoaMenuItemKernNone;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemKernNone.rbbas;&h7B022334;&h27A6BAC3;false Class=CocoaMenuItemKernTighten;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemKernTighten.rbbas;&h4955ABA9;&h27A6BAC3;false Class=CocoaMenuItemKernLoosen;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Kern Menu/CocoaMenuItemKernLoosen.rbbas;&h17794B82;&h27A6BAC3;false Class=CocoaMenuItemLigature;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu/CocoaMenuItemLigature.rbbas;&h1C4C917E;&h332FAE31;false Class=CocoaMenuItemLigatureDefault;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu/CocoaMenuItemLigatureDefault.rbbas;&h66E4375B;&h332FAE31;false Class=CocoaMenuItemLigatureNone;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu/CocoaMenuItemLigatureNone.rbbas;&h10EEADC9;&h332FAE31;false Class=CocoaMenuItemLigatureAll;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Ligature Menu/CocoaMenuItemLigatureAll.rbbas;&h25D3B174;&h332FAE31;false Class=CocoaMenuItemFormatFontBaseline;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemFormatFontBaseline.rbbas;&h6D278BB8;&h7F556EDD;false Class=CocoaMenuItemBaselineDefault;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineDefault.rbbas;&h3F4656AA;&h7F556EDD;false Class=CocoaMenuItemBaselineSuperscript;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineSuperscript.rbbas;&h22E41500;&h7F556EDD;false Class=CocoaMenuItemBaselineSubscript;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineSubscript.rbbas;&h2C1F068B;&h7F556EDD;false Class=CocoaMenuItemBaselineRaise;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineRaise.rbbas;&h28E6E7F4;&h7F556EDD;false Class=CocoaMenuItemBaselineLower;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.Baseline Menu/CocoaMenuItemBaselineLower.rbbas;&h4F869ACC;&h7F556EDD;false Class=CocoaMenuItemFormatFontCharacterShape;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.CharacterShape Menu/CocoaMenuItemFormatFontCharacterShape.rbbas;&hE1D3184;&h41E1F220;false Class=CocoaMenuItemCharShapeTraditional;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Font Menu/Format.Font.CharacterShape Menu/CocoaMenuItemCharShapeTraditional.rbbas;&h1E9E19FF;&h41E1F220;false Class=CocoaMenuItemWritingDirection;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirection.rbbas;&h1DBD05B3;&h51AA6795;false Class=CocoaMenuItemWritingDirectionBase;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionBase.rbbas;&h64C17BAB;&h51AA6795;false Class=CocoaMenuItemWritingDirectionBaseNatural;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionBaseNatural.rbbas;&h5A9E8CE0;&h51AA6795;false Class=CocoaMenuItemWritingDirectionBaseLeftToRight;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionBaseLeftToRight.rbbas;&h5F333640;&h51AA6795;false Class=CocoaMenuItemWritingDirectionBaseRightToLeft;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionBaseRightToLeft.rbbas;&h1B2F163A;&h51AA6795;false Class=CocoaMenuItemWritingDirectionText;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionText.rbbas;&h305C896D;&h51AA6795;false Class=CocoaMenuItemWritingDirectionTextNatural;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionTextNatural.rbbas;&hB42AD8F;&h51AA6795;false Class=CocoaMenuItemWritingDirectionTextLeftToRight;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionTextLeftToRight.rbbas;&h4690CEB5;&h51AA6795;false Class=CocoaMenuItemWritingDirectionTextRightToLeft;Modules/macoslib/Cocoa MenuItems/Format Menu/Format.Text Menu/Format.Text.WritingDirection Menu/CocoaMenuItemWritingDirectionTextRightToLeft.rbbas;&h4CF332EA;&h51AA6795;false Folder=Testing Grounds;Testing Grounds;&h5104D6F6;&h0;false Window=wndMainAlt;Testing Grounds/wndMainAlt.rbfrm;&h14BD1BAE;&h5104D6F6;false Class=MainToolbar;Testing Grounds/MainToolbar.rbbas;&hB6488CB;&h5104D6F6;false Module=ssWindowExtensions;Modules/macoslib/Convenience extensions and objects/ssWindowExtensions.rbbas;&h2698B23E;&h66335755;false Module=XMLDictionary;Modules/XMLDictionary.rbbas;&h7D72CDCA;&h298F9D05;false Folder=Flags;Images/Flags;&h70649F71;&h5510FB7A;false Picture=br;Images/Flags/br.png;&h5E202F02;&h70649F71;false;0;&h0 Picture=cn;Images/Flags/cn.png;&h12EE9E3B;&h70649F71;false;0;&h0 Picture=cs;Images/Flags/cs.png;&h6FD67ED8;&h70649F71;false;0;&h0 Picture=da;Images/Flags/da.png;&h6B2211EA;&h70649F71;false;0;&h0 Picture=de;Images/Flags/de.png;&h9C6923F;&h70649F71;false;0;&h0 Picture=es;Images/Flags/es.png;&h4BABACC2;&h70649F71;false;0;&h0 Picture=fi;Images/Flags/fi.png;&h73DB5D03;&h70649F71;false;0;&h0 Picture=fr;Images/Flags/fr.png;&h46B7ED07;&h70649F71;false;0;&h0 Picture=gb;Images/Flags/gb.png;&h552ACC7C;&h70649F71;false;0;&h0 Picture=gr;Images/Flags/gr.png;&h6CD74E38;&h70649F71;false;0;&h0 Picture=hr;Images/Flags/hr.png;&h2B50B801;&h70649F71;false;0;&h0 Picture=hu;Images/Flags/hu.png;&h4060A184;&h70649F71;false;0;&h0 Picture=il;Images/Flags/il.png;&h80C43C7;&h70649F71;false;0;&h0 Picture=it;Images/Flags/it.png;&h5D360397;&h70649F71;false;0;&h0 Picture=ja;Images/Flags/ja.png;&h5261FF6;&h70649F71;false;0;&h0 Picture=kr;Images/Flags/kr.png;&h9FC93C4;&h70649F71;false;0;&h0 Picture=nl;Images/Flags/nl.png;&h25496FA1;&h70649F71;false;0;&h0 Picture=no;Images/Flags/no.png;&h784007CC;&h70649F71;false;0;&h0 Picture=pl;Images/Flags/pl.png;&h33C06167;&h70649F71;false;0;&h0 Picture=pt;Images/Flags/pt.png;&h1B3B0D62;&h70649F71;false;0;&h0 Picture=ru;Images/Flags/ru.png;&h41EBEC8B;&h70649F71;false;0;&h0 Picture=sl;Images/Flags/sl.png;&h67F6FD22;&h70649F71;false;0;&h0 Picture=sv;Images/Flags/sv.png;&h8653A27;&h70649F71;false;0;&h0 Picture=tr;Images/Flags/tr.png;&h2DCD1C65;&h70649F71;false;0;&h0 Picture=us;Images/Flags/us.png;&h75038406;&h70649F71;false;0;&h0 Picture=lockedactive2x;Images/MovieDataTags@2x/locked-active@2x.png;&hF151CB1;&h62FA8680;false;0;&h0 Picture=lockedinactive2x;Images/MovieDataTags@2x/locked-inactive@2x.png;&h330EF1D9;&h62FA8680;false;0;&h0 Picture=lockedactive;Images/MovieDataTags/locked-active.png;&h1A283965;&h6E81FC20;false;0;&h0 Picture=lockedinactive;Images/MovieDataTags/locked-inactive.png;&h46D064F3;&h6E81FC20;false;0;&h0 Module=TraktTV;CoreServices/TraktTV.rbbas;&hB950306;&h18E3FCD2;false Window=wndRecommendations;Windows/Utility/wndRecommendations.rbfrm;&h5D31FECE;&h42AC283B;false Picture=status_rejected2x;Images/Status/status_rejected@2x.png;&hEF371A0;&h3D93657B;false;0;&h0 Picture=tb_services;Images/tb icons/tb_services.png;&h34F4A590;&h16FC0271;false;0;&h0 Picture=tb_services2x;Images/tb icons/tb_services@2x.png;&h29A1EDBF;&h16FC0271;false;0;&h0 Folder=Icons;Images/Icons;&h45F74405;&h5510FB7A;false Picture=facebook;Images/Icons/facebook.png;&h6C9309CB;&h45F74405;false;0;&h0 Picture=icoamazon;Images/Icons/ico-amazon.png;&h5748A18;&h45F74405;false;0;&h0 Picture=icoaol;Images/Icons/ico-aol.png;&h2616721A;&h45F74405;false;0;&h0 Picture=icoapple;Images/Icons/ico-apple.png;&hB9D5E25;&h45F74405;false;0;&h0 Picture=icoebay;Images/Icons/ico-ebay.png;&h89016BE;&h45F74405;false;0;&h0 Picture=icofacebook;Images/Icons/ico-facebook.png;&h2BC559FC;&h45F74405;false;0;&h0 Picture=icogoogle;Images/Icons/ico-google.png;&h2997077D;&h45F74405;false;0;&h0 Picture=icohdtrailershd;Images/Icons/ico-hdtrailers-hd.png;&h7A6CF685;&h45F74405;false;0;&h0 Picture=icohdtrailers;Images/Icons/ico-hdtrailers.png;&h7AD1634;&h45F74405;false;0;&h0 Picture=icoimdbhd;Images/Icons/ico-imdb-hd.png;&h748CF581;&h45F74405;false;0;&h0 Picture=icoimdb;Images/Icons/ico-imdb.png;&h524A6594;&h45F74405;false;0;&h0 Picture=icokat;Images/Icons/ico-kat.png;&h12534367;&h45F74405;false;0;&h0 Picture=icomoviesio;Images/Icons/ico-moviesio.png;&h186E6A3D;&h45F74405;false;0;&h0 Picture=iconetflix;Images/Icons/ico-netflix.png;&h790118F8;&h45F74405;false;0;&h0 Picture=icorottentomatoes;Images/Icons/ico-rottentomatoes.png;&h370EC17E;&h45F74405;false;0;&h0 Picture=icotmdbhd;Images/Icons/ico-tmdb-hd.png;&h29C19515;&h45F74405;false;0;&h0 Picture=icotmdb;Images/Icons/ico-tmdb.png;&h6422ECC3;&h45F74405;false;0;&h0 Picture=icotorrentz;Images/Icons/ico-torrentz.png;&h30E66B37;&h45F74405;false;0;&h0 Picture=icotpb;Images/Icons/ico-tpb.png;&h6789429B;&h45F74405;false;0;&h0 Picture=icotrakttvhd;Images/Icons/ico-trakttv-hd.png;&h647444DD;&h45F74405;false;0;&h0 Picture=icotrakttv;Images/Icons/ico-trakttv.png;&hD557E57;&h45F74405;false;0;&h0 Picture=icotvdbhd;Images/Icons/ico-tvdb-hd.png;&h67D9CA3D;&h45F74405;false;0;&h0 Picture=icotvdb;Images/Icons/ico-tvdb.png;&hB6CE1B5;&h45F74405;false;0;&h0 Picture=icotvragehd;Images/Icons/ico-tvrage-hd.png;&h19567995;&h45F74405;false;0;&h0 Picture=icotvtuneshd;Images/Icons/ico-tvtunes-hd.png;&h7C4873D7;&h45F74405;false;0;&h0 Picture=icotvtunes;Images/Icons/ico-tvtunes.png;&h78ADA9A5;&h45F74405;false;0;&h0 Picture=icotweet;Images/Icons/ico-tweet.png;&h515D0F2E;&h45F74405;false;0;&h0 Picture=icowatchseries;Images/Icons/ico-watchseries.png;&h34900063;&h45F74405;false;0;&h0 Picture=icowikipedia;Images/Icons/ico-wikipedia.png;&h5A09C030;&h45F74405;false;0;&h0 Picture=icoyahoo;Images/Icons/ico-yahoo.png;&h3628FF24;&h45F74405;false;0;&h0 Picture=icoyify;Images/Icons/ico-yify.png;&h3D86F1E9;&h45F74405;false;0;&h0 Picture=icoyourtvseries;Images/Icons/ico-yourtvseries.png;&h66745933;&h45F74405;false;0;&h0 Picture=icoyoutube;Images/Icons/ico-youtube.png;&h608C9977;&h45F74405;false;0;&h0 Picture=mail;Images/Icons/mail.png;&h2EAFC6CC;&h45F74405;false;0;&h0 Picture=tvr_logo;Images/Icons/tvr_logo.png;&h1624D4AC;&h45F74405;false;0;&h0 Picture=twitter;Images/Icons/twitter.png;&h4C06B535;&h45F74405;false;0;&h0 Picture=icofanarttvhd;Images/Icons/ico-fanarttv-hd.png;&h51C23BF8;&h45F74405;false;0;&h0 Window=wndTVGuide;Windows/Utility/wndTVGuide.rbfrm;&h73FA5C7F;&h42AC283B;false Picture=ca;Images/Flags/ca.png;&h34985E3B;&h70649F71;false;0;&h0 Picture=au;Images/Flags/au.png;&h15DD6138;&h70649F71;false;0;&h0 Picture=be;Images/Flags/be.png;&h7919F064;&h70649F71;false;0;&h0 Picture=se;Images/Flags/se.png;&h342D1D96;&h70649F71;false;0;&h0 Picture=ie;Images/Flags/ie.png;&h44281EB0;&h70649F71;false;0;&h0 Picture=tb_tvguide;Images/tb icons/tb_tvguide.png;&h7F17EE85;&h16FC0271;false;0;&h0 Picture=tb_tvguide2x;Images/tb icons/tb_tvguide@2x.png;&h7C2CE098;&h16FC0271;false;0;&h0 Picture=mx;Images/Flags/mx.png;&h5CAC9293;&h70649F71;false;0;&h0 Picture=metatagsaudiodtshd_ma;Images/Metatags/metatags-audio-dtshd_ma.png;&h5577D833;&h3C0EB9D;false;0;&h0 Picture=metatagsaudiodts_ma;Images/Metatags/metatags-audio-dts_ma.png;&h5AB5244F;&h3C0EB9D;false;0;&h0 Picture=icometa;Images/Icons/ico-meta.png;&h53D78B94;&h45F74405;false;0;&h0 Window=wndTVGuideNew;Windows/Utility/wndTVGuideNew.rbfrm;&h5169ABEC;&h42AC283B;false Module=NativeSubclass;Modules/NativeSubclass/NativeSubclass.rbbas;&h70967E5B;&h298F9D05;false Class=DateExtended;Modules/NativeSubclass/DateExtended.rbbas;&h6050BDA;&h70967E5B;false Class=RatingCanvas;Classes/RatingCanvas.rbbas;&h6D508849;&h61F91BC9;false Picture=icotorrentreactor;Images/Icons/ico-torrentreactor.png;&h674C9859;&h45F74405;false;0;&h0 Picture=icoleetx;Images/Icons/ico-leetx.png;&h55A671B0;&h45F74405;false;0;&h0 Picture=icoextratorrent;Images/Icons/ico-extratorrent.png;&h7CAD498C;&h45F74405;false;0;&h0 Picture=icorarbg;Images/Icons/ico-rarbg.png;&h54B807EC;&h45F74405;false;0;&h0 Picture=icolimetorrents;Images/Icons/ico-limetorrents.png;&h7E10840D;&h45F74405;false;0;&h0 Picture=icoeztv;Images/Icons/ico-eztv.png;&h6E4DF3C9;&h45F74405;false;0;&h0 Picture=icotorrenthound;Images/Icons/ico-torrenthound.png;&h3FC08B58;&h45F74405;false;0;&h0 Picture=icotorrentdownloads;Images/Icons/ico-torrentdownloads.png;&h389E1D77;&h45F74405;false;0;&h0 Picture=icobitsnoop;Images/Icons/ico-bitsnoop.png;&h14A0CE51;&h45F74405;false;0;&h0 Picture=icotorlock;Images/Icons/ico-torlock.png;&h49497411;&h45F74405;false;0;&h0 Module=RegExExtensions;Modules/RegExExtensions.rbbas;&h3981205A;&h298F9D05;false Folder=HTMLEntities;Modules/HTMLEntities;&h30E0DECE;&h298F9D05;false Module=HTMLEntities;Modules/HTMLEntities/HTMLEntities.rbbas;&h7B440119;&h30E0DECE;false Class=HTMLEntity;Modules/HTMLEntities/HTMLEntity.rbbas;&h2DA4912E;&h30E0DECE;false DefaultWindow=wndMain AppMenuBar=mBarMain MajorVersion=0 MinorVersion=7 SubVersion=0 NonRelease=23 Release=1 InfoVersion=Multi media manager LongVersion=v0.7α16 ©2011-2017 Vidal van Bergen ShortVersion=v0.7α16 WinCompanyName=Vitalis Software WinInternalName=#App.kAppName WinProductName=#App.kAppName AutoIncrementVersionInformation=True BuildFlags=&h1100 BuildLanguage=&h1 DebugLanguage=&h1 Region= WindowsName=ViMediaManager.exe MacCarbonMachName=#App.kAppName LinuxX86Name=#App.kAppName MacCreator=ViMM MDI=0 MDICaption= DefaultEncoding=&h0 AppIcon=ViMM.rbres;&h0 OSXBundleID=#App.Identifier DebuggerCommandLine= UseGDIPlus=True UseBuildsFolder=True IsWebProject=False \ No newline at end of file diff --git a/ViMM/Windows/Movie Section/wndMovieMetadata.rbfrm b/ViMM/Windows/Movie Section/wndMovieMetadata.rbfrm old mode 100755 new mode 100644 diff --git a/ViMM/Windows/TV Show Section/wndShowMetadata.rbfrm b/ViMM/Windows/TV Show Section/wndShowMetadata.rbfrm old mode 100755 new mode 100644 diff --git a/ViMM/Windows/Utility/wndHTMLExporter.rbfrm b/ViMM/Windows/Utility/wndHTMLExporter.rbfrm old mode 100755 new mode 100644 diff --git a/ViMM/Windows/Utility/wndPreviewThumbs.rbfrm b/ViMM/Windows/Utility/wndPreviewThumbs.rbfrm old mode 100755 new mode 100644 index baeb2bb..98babfe --- a/ViMM/Windows/Utility/wndPreviewThumbs.rbfrm +++ b/ViMM/Windows/Utility/wndPreviewThumbs.rbfrm @@ -1 +1 @@ -#tag Window Begin Window wndPreviewThumbs BackColor = 16777215 Backdrop = "" CloseButton = True Composite = False Frame = 0 FullScreen = False HasBackColor = False Height = 400 ImplicitInstance= True LiveResize = True MacProcID = 0 MaxHeight = 32000 MaximizeButton = True MaxWidth = 32000 MenuBar = 1167647679 MenuBarVisible = True MinHeight = 64 MinimizeButton = False MinWidth = 64 Placement = 3 Resizeable = True Title = "Thumb Previewer" Visible = True Width = 600 Begin ccCancelSave CancelSave AcceptFocus = "" AcceptTabs = True AutoDeactivate = True BackColor = 16777215 Backdrop = "" Enabled = True EraseBackground = True HasBackColor = False Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 380 LockBottom = True LockedInPosition= False LockLeft = False LockRight = True LockTop = False Scope = 0 TabIndex = 2 TabPanelIndex = 0 TabStop = True Top = 358 UseFocusRing = "" Visible = True Width = 200 End Begin ccThumbView ccThumbs AcceptFocus = "" AcceptTabs = True AutoDeactivate = True BackColor = 16777215 Backdrop = "" Enabled = True EraseBackground = True HasBackColor = False Height = 346 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 0 LockBottom = True LockedInPosition= False LockLeft = True LockRight = True LockTop = True MaxCols = 0 MaxRows = 0 Scope = 0 Selection = -1 TabIndex = 3 TabPanelIndex = 0 TabStop = True ThumbSize = 128 Top = 0 UseFocusRing = "" Visible = True Width = 600 End Begin Slider sldThumbSize AutoDeactivate = True Enabled = True Height = 23 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 20 LineStep = 1 LiveScroll = True LockBottom = True LockedInPosition= False LockLeft = True LockRight = True LockTop = False Maximum = 512 Minimum = 32 PageStep = 20 Scope = 0 TabIndex = 4 TabPanelIndex = 0 TabStop = True TickStyle = 0 Top = 358 Value = 128 Visible = True Width = 298 End Begin Label lblSize AutoDeactivate = True Bold = "" DataField = "" DataSource = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 330 LockBottom = True LockedInPosition= False LockLeft = False LockRight = True LockTop = False Multiline = "" Scope = 0 Selectable = False TabIndex = 5 TabPanelIndex = 0 TabStop = True Text = "###" TextAlign = 1 TextColor = &h000000 TextFont = "System" TextSize = 0 TextUnit = 0 Top = 358 Transparent = False Underline = "" Visible = True Width = 38 End Begin ProgressBar pgBar AutoDeactivate = True Enabled = True Height = 20 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 20 LockBottom = True LockedInPosition= False LockLeft = True LockRight = True LockTop = False Maximum = 0 Scope = 0 TabIndex = 4 TabPanelIndex = 0 TabStop = True Top = 416 Value = 0 Visible = True Width = 348 End End #tag EndWindow #tag WindowCode #tag Event Sub Close() Preferences.SaveWindowPos( Self, "wndArtPreview" ) wndMain.ProgressRunning = False wndMain.lstMovies.Enabled = True wndMain.lstTVShows.Enabled = True End Sub #tag EndEvent #tag Event Sub Deactivate() 'self.Show End Sub #tag EndEvent #tag Event Sub Open() Preferences.LoadWindowPos( Self, "wndArtPreview" ) wndMain.ProgressRunning = True wndMain.lstMovies.Enabled = False wndMain.lstTVShows.Enabled = False End Sub #tag EndEvent #tag MenuHandler Function FileCloseWindow() As Boolean Handles FileCloseWindow.Action Close Return True End Function #tag EndMenuHandler #tag Method, Flags = &h0 Sub Init(Images() as Picture, Optional Dimensions() as String, Optional Locations() as String, CurrentMode as String, CurrentSeason as Integer = - 1) If Images.Ubound > -1 Then ccThumbs.Thumbs = Images If Dimensions.Ubound > -1 Then ccThumbs.Dimensions = Dimensions If Locations.Ubound > -1 Then ccThumbs.Locations = Locations Mode = CurrentMode Season = CurrentSeason If Images.Ubound > -1 Then Self.Title = Str( Images.Ubound +1 ) + " " + Loc.kImages.Lowercase Else Self.Title = "" End If ccThumbs.cvsPreview.Reload End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SaveImage() Dim ImageDestination, ImageFile as FolderItem Dim Title, Type as String Dim tmpPic as Picture Select Case ActiveSection Case 0 ImageDestination = MovieAttr.FolderParent Title = MovieAttr.Title Case 1 ImageDestination = TVAttr.FolderParent Title = TVAttr.Title Case 2 'ImageDestination = AnimeAttr.FolderParent 'Title = AnimeAttr.Title End Select 'lblSize.Visible = False 'sldThumbSize.Visible = False 'CancelSave.Enabled = False 'pgBar.Visible = True 'pgBar.Top = sldThumbSize.Top Dim SeasonName as String Select Case Mode // Movies@TMDB Case "Posters" If ActiveSection = 0 Then ImageFile = MovieAttr.DestinationPoster( ImageDestination ) Else ImageFile = ImageDestination.Child("poster.jpg") End If Type = Loc.kPoster Case "Backdrops" If ActiveSection = 0 Then ImageFile = MovieAttr.DestinationFanart( ImageDestination ) Else ImageFile = ImageDestination.Child("fanart.jpg") End If Type = Loc.kFanart Case "Banners" If ActiveSection = 0 Then ImageFile = MovieAttr.DestinationBanner( ImageDestination ) Else ImageFile = ImageDestination.Child("banner.jpg") End If Type = Loc.kBanner Case "ClearArt" ImageFile = ImageDestination.Child("clearart.png") Type = Loc.kClearArt Case "Logos" ImageFile = ImageDestination.Child("logo.png") Type = Loc.kLogo Case "Thumbs" ImageFile = ImageDestination.Child("landscape.jpg") Type = Loc.kThumb Case "DiscArt" ImageFile = ImageDestination.Child("disc.png") Type = Loc.kDiscArt Case "CharacterArt" ImageFile = ImageDestination.Child("character.png") Type = Loc.kCharacterArt Case "SeasonThumb" SeasonName = "season%S-landscape.jpg" If Season = 0 Then SeasonName = "season-specials-landscape.jpg" If Season < 0 Then SeasonName = "season-all-landscape.jpg" // YAMJ If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonName = "season %S.landscape.jpg" If Season = 0 Then SeasonName = "specials.landscape.jpg" If Season < 0 Then SeasonName = "seasonall.landscape.jpg" End If Type = Loc.kSeasonThumb Case "SeasonPoster" SeasonName = "season%S-poster.jpg" If Season = 0 Then SeasonName = "season-specials-poster.jpg" If Season < 0 Then SeasonName = "season-all-poster.jpg" Type = Loc.kSeason + " " + Loc.kPoster Case "SeasonBanner" SeasonName = "season%S-banner.jpg" If Season = 0 Then SeasonName = "season-specials-banner.jpg" If Season < 0 Then SeasonName = "season-all-banner.jpg" // YAMJ If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonName = "season %S.banner.jpg" If Season = 0 Then SeasonName = "specials.banner.jpg" If Season < 0 Then SeasonName = "seasonall.banner.jpg" End If Type = Loc.kSeason + " " + Loc.kBanner Case "SeasonFanart" SeasonName = "season%S-fanart.jpg" If Season = 0 Then SeasonName = "season-specials-fanart.jpg" If Season < 0 Then SeasonName = "season-all-fanart.jpg" // YAMJ If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonName = "season %S.fanart.jpg" If Season = 0 Then SeasonName = "specials.fanart.jpg" If Season < 0 Then SeasonName = "seasonall.fanart.jpg" End If Type = Loc.kSeason + " " + Loc.kFanart End Select // Season location If Mode.InStr( 0, "Season" ) > 0 Then 'If Season = -1 Then Season = 1 Dim SeasonDisplay as String = Str( Season ) If SeasonDisplay.Len = 1 And Prefs.stringForKey("MediaPlayer") <> "YAMJ" Then SeasonDisplay = "0" + SeasonDisplay If Season = 0 Then 'If ImageDestination.Child("Specials").Exists Then ImageDestination = ImageDestination.Child("Specials") ImageFile = ImageDestination.Child( SeasonName.ReplaceAll( "%S", "all" ) ) Else 'If ImageDestination.Child( "Season " + SeasonDisplay ).Exists Then 'SeasonName.ReplaceAll( "%S", SeasonDisplay ) ).Exists Then 'ImageFile = ImageDestination.Child( "Season " + SeasonDisplay ).Child( SeasonName.ReplaceAll( "%S", SeasonDisplay ) ) 'ElseIf ImageDestination.Child( TVAttr.Title.ReplaceAll( ":", " - " ) ) <> Nil And ImageDestination.Child( TVAttr.Title.ReplaceAll( ":", " - " ) ).Exists Then 'ImageFile = ImageDestination.Child( TVAttr.Title ).Child( SeasonName.ReplaceAll( "%S", SeasonDisplay ) ) 'End If If ImageFile = Nil Then ImageFile = TVAttr.FolderParent.Child( SeasonName.ReplaceAll( "%S", SeasonDisplay ) ) 'ImageFile = ImageDestination.Child( SeasonName.ReplaceAll( "%S", SeasonDisplay ) ) ImageDestination = ImageFile.Parent End If End If Dim c1 as Integer = ccThumbs.Selection Dim c2 as Integer = ccThumbs.Locations.Ubound If ImageFile <> Nil And ImageFile.Exists Then If MsgDlg( Nil, 1, msgPriorArtFound.ReplaceAll("<image>", Type.Lowercase).ReplaceAll("<title>", Title), msgPriorArtDeletion.ReplaceAll("<image>", Type.Lowercase), Loc.dlgReplace, Loc.dlgCancel ) = 1 Then If ImageFile <> Nil ANd ImageFile.IsWriteable Then If ImageFile.IsNetworkVolume Then ImageFile.Delete Else ImageFile.MoveToTrash() End If ImageFile = ImageFile.Parent.Child( ImageFile.Name ) Else 'CancelSave.Enabled = True 'pgBar.Visible = False Return End If End If lblSize.Visible = False sldThumbSize.Visible = False CancelSave.Enabled = False pgBar.Visible = True pgBar.Top = sldThumbSize.Top If ( ImageFile = Nil or NOT ImageFile.Exists ) And ImageDestination.Exists Then Dim Location as String If ccThumbs.Selection > -1 Then Location = ccThumbs.Locations( ccThumbs.Selection ) Else Location = ccThumbs.Locations( 0 ) End If If Location.Left(4) = "file" Then Dim f as FolderItem = GetFolderItem( Location ) If f <> Nil and F.Exists Then tmpPic = Picture.Open( f ) f.MoveFileTo ImageDestination End If ElseIf Location.Left(4) = "http" Then tmpPic = URL2Picture( Location, ImageDestination, ImageFile.Name ) 'URL2Picture( Location, ImageFile.NameNoExtension, ImageFile.Extension, ImageDestination ) End If End If Select Case Mode Case "Posters" If ActiveSection = 0 Then MovieAttr.ART_Poster = tmpPic CacheImageSet( MovieAttr.ART_Poster, MovieAttr.ID_IMDB + ".movie.poster.jpg" ) ElseIf ActiveSection = 1 Then TVAttr.ART_Poster = tmpPic CacheImageSet( tmpPic, TVAttr.ID_IMDb + ".television.poster.jpg" ) End If Case "Backdrops" If ActiveSection = 0 Then MovieAttr.ART_Fanart = tmpPic CacheImageSet( MovieAttr.ART_Fanart, MovieAttr.ID_IMDB + ".movie.fanart.jpg" ) ElseIf ActiveSection = 1 Then TVAttr.ART_Fanart = tmpPic CacheImageSet( tmpPic, TVAttr.ID_IMDb + ".television.fanart.jpg" ) End If Case "Banners" If ActiveSection = 0 Then MovieAttr.ART_Banner = tmpPic ElseIf ActiveSection = 1 Then TVAttr.ART_Banner = tmpPic End If Case "ClearArt" If ActiveSection = 0 Then MovieAttr.ART_ClearArt = tmpPic ElseIf ActiveSection = 1 Then TVAttr.ART_ClearArt = tmpPic End If Case "Logos" If ActiveSection = 0 Then MovieAttr.ART_Logo = tmpPic ElseIf ActiveSection = 1 Then TVAttr.ART_Logo = tmpPic End If Case "Thumbs" If ActiveSection = 0 Then MovieAttr.ART_Thumb = tmpPic ElseIf ActiveSection = 1 Then TVAttr.ART_TVThumb = tmpPic End If Case "CharacterArt" If ActiveSection = 1 Then TVAttr.ART_CharacterArt = tmpPic End If End Select If ActiveSection = 0 Then wndMain.lstMovies.UpdateRow wndMain.cvsMovieDetails.Reload ElseIf ActiveSection = 1 And Mode.InStr(0, "Season") = 0 Then wndMain.lstTVShows.UpdateRow wndMain.cvsTVShowDetails.Reload ElseIf ActiveSection = 2 Then // TODO End If pgBar.Visible = False Close End Sub #tag EndMethod #tag Property, Flags = &h0 Mode As String #tag EndProperty #tag Property, Flags = &h0 Season As Integer #tag EndProperty #tag Constant, Name = msgPriorArtDeletion, Type = String, Dynamic = True, Default = \"Would you like to replace your existing <image> file with the chosen image\?", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Would you like to replace your existing <image> file with the chosen image\?" #Tag Instance, Platform = Any, Language = nl, Definition = \"Wil je het bestaande <image> bestand vervangen met het gekozen afbeeldingen\?" #Tag Instance, Platform = Any, Language = sv, Definition = \"Vill du ers\xC3\xA4tta befintlig <image> fil med den valda bilden\?" #Tag Instance, Platform = Any, Language = de, Definition = \"Soll die existierende <image> Datei durch das gew\xC3\xA4hlte Bild ersetzt werden\?" #Tag Instance, Platform = Any, Language = fr, Definition = \"Voulez-vous remplacer votre <image> actuelle par l\'image s\xC3\xA9lectionn\xC3\xA9e \?" #tag EndConstant #tag Constant, Name = msgPriorArtFound, Type = String, Dynamic = True, Default = \"ViMediaManager has found an existing <image> file for \'<title>\'.", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"ViMediaManager has found an existing <image> file for \'<title>\'." #Tag Instance, Platform = Any, Language = nl, Definition = \"ViMediaManager heeft een al bestaande <image> bestand gevonden voor \'<title>\'." #Tag Instance, Platform = Any, Language = sv, Definition = \"ViMediaManager har hittat en befintlig <image> fil f\xC3\xB6r \'<title>\'." #Tag Instance, Platform = Any, Language = de, Definition = \"ViMediaManager hat eine existierende <image> Datei f\xC3\xBCr \'<title>\' gefunden." #Tag Instance, Platform = Any, Language = fr, Definition = \"ViMediaManager a trouv\xC3\xA9 une <image> existante pour \'<title>\'." #tag EndConstant #tag EndWindowCode #tag Events CancelSave #tag Event Sub ActionCancel() Close End Sub #tag EndEvent #tag Event Sub ActionOK() SaveImage() End Sub #tag EndEvent #tag Event Sub Open() Me.CaptionOK = Loc.kDownload End Sub #tag EndEvent #tag EndEvents #tag Events ccThumbs #tag Event Sub DoubleClick(X as Integer, Y as Integer) If Me.Selection > -1 Then SaveImage() End Sub #tag EndEvent #tag Event Sub Activate() wndMain.lstMovies.Enabled = False End Sub #tag EndEvent #tag EndEvents #tag Events sldThumbSize #tag Event Sub ValueChanged() If NOT Keyboard.AsyncCommandKey Then If Me.Value < 64 + 10 And Me.Value > 64 - 10 Then Me.Value = 64 If Me.Value < 128 + 10 And Me.Value > 128 - 10 Then Me.Value = 128 If Me.Value < 256 + 10 And Me.Value > 256 - 10 Then Me.Value = 256 If Me.Value < 384 + 10 And Me.Value > 384 - 10 Then Me.Value = 384 End If ccThumbs.ThumbSize = Me.Value Prefs.integerForKey( "PreviewThumbSize" ) = Me.Value lblSize.Text = Str( Me.Value ) ccThumbs.cvsPreview.Reload ccThumbs.scrBar.PageStep = Me.Value End Sub #tag EndEvent #tag Event Sub Open() Me.Value = Prefs.integerForKey( "PreviewThumbSize" ) lblSize.Text = Str( Me.Value ) End Sub #tag EndEvent #tag EndEvents \ No newline at end of file +#tag Window Begin Window wndPreviewThumbs BackColor = 16777215 Backdrop = "" CloseButton = True Composite = False Frame = 0 FullScreen = False HasBackColor = False Height = 400 ImplicitInstance= True LiveResize = True MacProcID = 0 MaxHeight = 32000 MaximizeButton = True MaxWidth = 32000 MenuBar = 1167647679 MenuBarVisible = True MinHeight = 64 MinimizeButton = False MinWidth = 64 Placement = 3 Resizeable = True Title = "Thumb Previewer" Visible = True Width = 600 Begin ccCancelSave CancelSave AcceptFocus = "" AcceptTabs = True AutoDeactivate = True BackColor = 16777215 Backdrop = "" Enabled = True EraseBackground = True HasBackColor = False Height = 22 HelpTag = "" InitialParent = "" Left = 380 LockBottom = True LockedInPosition= False LockLeft = False LockRight = True LockTop = False Scope = 0 TabIndex = 2 TabPanelIndex = 0 TabStop = True Top = 358 UseFocusRing = "" Visible = True Width = 200 End Begin ccThumbView ccThumbs AcceptFocus = "" AcceptTabs = True AutoDeactivate = True BackColor = 16777215 Backdrop = "" Enabled = True EraseBackground = True HasBackColor = False Height = 346 HelpTag = "" InitialParent = "" Left = 0 LockBottom = True LockedInPosition= False LockLeft = True LockRight = True LockTop = True MaxCols = 0 MaxRows = 0 Scope = 0 Selection = -1 TabIndex = 3 TabPanelIndex = 0 TabStop = True ThumbSize = 128 Top = 0 UseFocusRing = "" Visible = True Width = 600 End Begin Slider sldThumbSize AutoDeactivate = True Enabled = True Height = 23 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 20 LineStep = 1 LiveScroll = True LockBottom = True LockedInPosition= False LockLeft = True LockRight = True LockTop = False Maximum = 512 Minimum = 32 PageStep = 20 Scope = 0 TabIndex = 4 TabPanelIndex = 0 TabStop = True TickStyle = 0 Top = 358 Value = 128 Visible = True Width = 298 End Begin Label lblSize AutoDeactivate = True Bold = "" DataField = "" DataSource = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 330 LockBottom = True LockedInPosition= False LockLeft = False LockRight = True LockTop = False Multiline = "" Scope = 0 Selectable = False TabIndex = 5 TabPanelIndex = 0 Text = "###" TextAlign = 1 TextColor = &h000000 TextFont = "System" TextSize = 0 TextUnit = 0 Top = 358 Transparent = False Underline = "" Visible = True Width = 38 End Begin ProgressBar pgBar AutoDeactivate = True Enabled = True Height = 20 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 20 LockBottom = True LockedInPosition= False LockLeft = True LockRight = True LockTop = False Maximum = 0 Scope = 0 TabPanelIndex = 0 Top = 416 Value = 0 Visible = True Width = 348 End End #tag EndWindow #tag WindowCode #tag Event Sub Close() Preferences.SaveWindowPos( Self, "wndArtPreview" ) wndMain.ProgressRunning = False wndMain.lstMovies.Enabled = True wndMain.lstTVShows.Enabled = True End Sub #tag EndEvent #tag Event Sub Deactivate() 'self.Show End Sub #tag EndEvent #tag Event Sub Open() Preferences.LoadWindowPos( Self, "wndArtPreview" ) wndMain.ProgressRunning = True wndMain.lstMovies.Enabled = False wndMain.lstTVShows.Enabled = False End Sub #tag EndEvent #tag MenuHandler Function FileCloseWindow() As Boolean Handles FileCloseWindow.Action Close Return True End Function #tag EndMenuHandler #tag Method, Flags = &h0 Sub Init(Images() as Picture, Optional Dimensions() as String, Optional Locations() as String, CurrentMode as String, CurrentSeason as Integer = - 1) If Images.Ubound > -1 Then ccThumbs.Thumbs = Images If Dimensions.Ubound > -1 Then ccThumbs.Dimensions = Dimensions If Locations.Ubound > -1 Then ccThumbs.Locations = Locations Mode = CurrentMode Season = CurrentSeason If Images.Ubound > -1 Then Self.Title = Str( Images.Ubound +1 ) + " " + Loc.kImages.Lowercase Else Self.Title = "" End If ccThumbs.cvsPreview.Reload End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SaveImage() Dim ImageDestination, ImageFile as FolderItem Dim Title, Type as String Dim tmpPic as Picture Select Case ActiveSection Case 0 ImageDestination = MovieAttr.FolderParent Title = MovieAttr.Title Case 1 ImageDestination = TVAttr.FolderParent Title = TVAttr.Title Case 2 'ImageDestination = AnimeAttr.FolderParent 'Title = AnimeAttr.Title End Select 'lblSize.Visible = False 'sldThumbSize.Visible = False 'CancelSave.Enabled = False 'pgBar.Visible = True 'pgBar.Top = sldThumbSize.Top Dim SeasonName as String Select Case Mode // Movies@TMDB Case "Posters" If ActiveSection = 0 Then ImageFile = MovieAttr.DestinationPoster( ImageDestination ) Else ImageFile = ImageDestination.Child("poster.jpg") End If Type = Loc.kPoster Case "Backdrops" If ActiveSection = 0 Then ImageFile = MovieAttr.DestinationFanart( ImageDestination ) Else ImageFile = ImageDestination.Child("fanart.jpg") End If Type = Loc.kFanart Case "Banners" If ActiveSection = 0 Then ImageFile = MovieAttr.DestinationBanner( ImageDestination ) Else ImageFile = ImageDestination.Child("banner.jpg") End If Type = Loc.kBanner Case "ClearArt" ImageFile = ImageDestination.Child("clearart.png") Type = Loc.kClearArt Case "Logos" ImageFile = ImageDestination.Child("logo.png") Type = Loc.kLogo Case "Thumbs" ImageFile = ImageDestination.Child("landscape.jpg") Type = Loc.kThumb Case "DiscArt" ImageFile = ImageDestination.Child("disc.png") Type = Loc.kDiscArt Case "CharacterArt" ImageFile = ImageDestination.Child("character.png") Type = Loc.kCharacterArt Case "SeasonThumb" SeasonName = "season%S-landscape.jpg" If Season = 0 Then SeasonName = "season-specials-landscape.jpg" If Season < 0 Then SeasonName = "season-all-landscape.jpg" // YAMJ If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonName = "season %S.landscape.jpg" If Season = 0 Then SeasonName = "specials.landscape.jpg" If Season < 0 Then SeasonName = "seasonall.landscape.jpg" End If Type = Loc.kSeasonThumb Case "SeasonPoster" SeasonName = "season%S-poster.jpg" If Season = 0 Then SeasonName = "season-specials-poster.jpg" If Season < 0 Then SeasonName = "season-all-poster.jpg" Type = Loc.kSeason + " " + Loc.kPoster Case "SeasonBanner" SeasonName = "season%S-banner.jpg" If Season = 0 Then SeasonName = "season-specials-banner.jpg" If Season < 0 Then SeasonName = "season-all-banner.jpg" // YAMJ If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonName = "season %S.banner.jpg" If Season = 0 Then SeasonName = "specials.banner.jpg" If Season < 0 Then SeasonName = "seasonall.banner.jpg" End If Type = Loc.kSeason + " " + Loc.kBanner Case "SeasonFanart" SeasonName = "season%S-fanart.jpg" If Season = 0 Then SeasonName = "season-specials-fanart.jpg" If Season < 0 Then SeasonName = "season-all-fanart.jpg" // YAMJ If Prefs.stringForKey("MediaPlayer") = "YAMJ" Then SeasonName = "season %S.fanart.jpg" If Season = 0 Then SeasonName = "specials.fanart.jpg" If Season < 0 Then SeasonName = "seasonall.fanart.jpg" End If Type = Loc.kSeason + " " + Loc.kFanart End Select // Season location If Mode.InStr( 0, "Season" ) > 0 Then 'If Season = -1 Then Season = 1 Dim SeasonDisplay as String = Str( Season ) If SeasonDisplay.Len = 1 And Prefs.stringForKey("MediaPlayer") <> "YAMJ" Then SeasonDisplay = "0" + SeasonDisplay If Season = 0 Then 'If ImageDestination.Child("Specials").Exists Then ImageDestination = ImageDestination.Child("Specials") ImageFile = ImageDestination.Child( SeasonName.ReplaceAll( "%S", "all" ) ) Else 'If ImageDestination.Child( "Season " + SeasonDisplay ).Exists Then 'SeasonName.ReplaceAll( "%S", SeasonDisplay ) ).Exists Then 'ImageFile = ImageDestination.Child( "Season " + SeasonDisplay ).Child( SeasonName.ReplaceAll( "%S", SeasonDisplay ) ) 'ElseIf ImageDestination.Child( TVAttr.Title.ReplaceAll( ":", " - " ) ) <> Nil And ImageDestination.Child( TVAttr.Title.ReplaceAll( ":", " - " ) ).Exists Then 'ImageFile = ImageDestination.Child( TVAttr.Title ).Child( SeasonName.ReplaceAll( "%S", SeasonDisplay ) ) 'End If If ImageFile = Nil Then ImageFile = TVAttr.FolderParent.Child( SeasonName.ReplaceAll( "%S", SeasonDisplay ) ) 'ImageFile = ImageDestination.Child( SeasonName.ReplaceAll( "%S", SeasonDisplay ) ) ImageDestination = ImageFile.Parent End If End If Dim c1 as Integer = ccThumbs.Selection Dim c2 as Integer = ccThumbs.Locations.Ubound If ImageFile <> Nil And ImageFile.Exists Then If MsgDlg( Nil, 1, msgPriorArtFound.ReplaceAll("<image>", Type.Lowercase).ReplaceAll("<title>", Title), msgPriorArtDeletion.ReplaceAll("<image>", Type.Lowercase), Loc.dlgReplace, Loc.dlgCancel ) = 1 Then If ImageFile <> Nil ANd ImageFile.IsWriteable Then If ImageFile.IsNetworkVolume Then ImageFile.Delete Else ImageFile.MoveToTrash() End If ImageFile = ImageFile.Parent.Child( ImageFile.Name ) Else 'CancelSave.Enabled = True 'pgBar.Visible = False Return End If End If lblSize.Visible = False sldThumbSize.Visible = False CancelSave.Enabled = False pgBar.Visible = True pgBar.Top = sldThumbSize.Top If ( ImageFile = Nil or NOT ImageFile.Exists ) And ImageDestination.Exists Then Dim Location as String If ccThumbs.Selection > -1 Then Location = ccThumbs.Locations( ccThumbs.Selection ) Else Location = ccThumbs.Locations( 0 ) End If If Location.Left(4) = "file" Then Dim f as FolderItem = GetFolderItem( Location ) If f <> Nil and F.Exists Then tmpPic = Picture.Open( f ) f.MoveFileTo ImageDestination End If ElseIf Location.Left(4) = "http" Then tmpPic = URL2Picture( Location, ImageDestination, ImageFile.Name ) 'URL2Picture( Location, ImageFile.NameNoExtension, ImageFile.Extension, ImageDestination ) End If End If Select Case Mode Case "Posters" If ActiveSection = 0 Then MovieAttr.ART_Poster = tmpPic CacheImageSet( MovieAttr.ART_Poster, MovieAttr.ID_IMDB + ".movie.poster.jpg" ) ElseIf ActiveSection = 1 Then TVAttr.ART_Poster = tmpPic CacheImageSet( tmpPic, TVAttr.ID_IMDb + ".television.poster.jpg" ) End If Case "Backdrops" If ActiveSection = 0 Then MovieAttr.ART_Fanart = tmpPic CacheImageSet( MovieAttr.ART_Fanart, MovieAttr.ID_IMDB + ".movie.fanart.jpg" ) ElseIf ActiveSection = 1 Then TVAttr.ART_Fanart = tmpPic CacheImageSet( tmpPic, TVAttr.ID_IMDb + ".television.fanart.jpg" ) End If Case "Banners" If ActiveSection = 0 Then MovieAttr.ART_Banner = tmpPic ElseIf ActiveSection = 1 Then TVAttr.ART_Banner = tmpPic End If Case "ClearArt" If ActiveSection = 0 Then MovieAttr.ART_ClearArt = tmpPic ElseIf ActiveSection = 1 Then TVAttr.ART_ClearArt = tmpPic End If Case "Logos" If ActiveSection = 0 Then MovieAttr.ART_Logo = tmpPic ElseIf ActiveSection = 1 Then TVAttr.ART_Logo = tmpPic End If Case "Thumbs" If ActiveSection = 0 Then MovieAttr.ART_Thumb = tmpPic ElseIf ActiveSection = 1 Then TVAttr.ART_TVThumb = tmpPic End If Case "CharacterArt" If ActiveSection = 1 Then TVAttr.ART_CharacterArt = tmpPic End If End Select If ActiveSection = 0 Then wndMain.lstMovies.UpdateRow wndMain.cvsMovieDetails.Reload ElseIf ActiveSection = 1 And Mode.InStr(0, "Season") = 0 Then wndMain.lstTVShows.UpdateRow wndMain.cvsTVShowDetails.Reload ElseIf ActiveSection = 2 Then // TODO End If pgBar.Visible = False Close End Sub #tag EndMethod #tag Property, Flags = &h0 Mode As String #tag EndProperty #tag Property, Flags = &h0 Season As Integer #tag EndProperty #tag Constant, Name = msgPriorArtDeletion, Type = String, Dynamic = True, Default = \"Would you like to replace your existing <image> file with the chosen image\?", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Would you like to replace your existing <image> file with the chosen image\?" #Tag Instance, Platform = Any, Language = nl, Definition = \"Wil je het bestaande <image> bestand vervangen met het gekozen afbeeldingen\?" #Tag Instance, Platform = Any, Language = sv, Definition = \"Vill du ers\xC3\xA4tta befintlig <image> fil med den valda bilden\?" #Tag Instance, Platform = Any, Language = de, Definition = \"Soll die existierende <image> Datei durch das gew\xC3\xA4hlte Bild ersetzt werden\?" #Tag Instance, Platform = Any, Language = fr, Definition = \"Voulez-vous remplacer votre <image> actuelle par l\'image s\xC3\xA9lectionn\xC3\xA9e \?" #tag EndConstant #tag Constant, Name = msgPriorArtFound, Type = String, Dynamic = True, Default = \"ViMediaManager has found an existing <image> file for \'<title>\'.", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"ViMediaManager has found an existing <image> file for \'<title>\'." #Tag Instance, Platform = Any, Language = nl, Definition = \"ViMediaManager heeft een al bestaande <image> bestand gevonden voor \'<title>\'." #Tag Instance, Platform = Any, Language = sv, Definition = \"ViMediaManager har hittat en befintlig <image> fil f\xC3\xB6r \'<title>\'." #Tag Instance, Platform = Any, Language = de, Definition = \"ViMediaManager hat eine existierende <image> Datei f\xC3\xBCr \'<title>\' gefunden." #Tag Instance, Platform = Any, Language = fr, Definition = \"ViMediaManager a trouv\xC3\xA9 une <image> existante pour \'<title>\'." #tag EndConstant #tag EndWindowCode #tag Events CancelSave #tag Event Sub ActionCancel() Close End Sub #tag EndEvent #tag Event Sub ActionOK() SaveImage() End Sub #tag EndEvent #tag Event Sub Open() Me.CaptionOK = Loc.kDownload End Sub #tag EndEvent #tag EndEvents #tag Events ccThumbs #tag Event Sub DoubleClick(X as Integer, Y as Integer) If Me.Selection > -1 Then SaveImage() End Sub #tag EndEvent #tag Event Sub Activate() wndMain.lstMovies.Enabled = False End Sub #tag EndEvent #tag EndEvents #tag Events sldThumbSize #tag Event Sub ValueChanged() If NOT Keyboard.AsyncCommandKey Then If Me.Value < 64 + 10 And Me.Value > 64 - 10 Then Me.Value = 64 If Me.Value < 128 + 10 And Me.Value > 128 - 10 Then Me.Value = 128 If Me.Value < 256 + 10 And Me.Value > 256 - 10 Then Me.Value = 256 If Me.Value < 384 + 10 And Me.Value > 384 - 10 Then Me.Value = 384 End If ccThumbs.ThumbSize = Me.Value Prefs.integerForKey( "PreviewThumbSize" ) = Me.Value lblSize.Text = Str( Me.Value ) ccThumbs.cvsPreview.Reload ccThumbs.scrBar.PageStep = Me.Value End Sub #tag EndEvent #tag Event Sub Open() Me.Value = Prefs.integerForKey( "PreviewThumbSize" ) lblSize.Text = Str( Me.Value ) End Sub #tag EndEvent #tag EndEvents \ No newline at end of file diff --git a/ViMM/Windows/Utility/wndSearch.rbfrm b/ViMM/Windows/Utility/wndSearch.rbfrm old mode 100755 new mode 100644 index f6c3d32..59b04ee --- a/ViMM/Windows/Utility/wndSearch.rbfrm +++ b/ViMM/Windows/Utility/wndSearch.rbfrm @@ -1 +1 @@ -#tag Window Begin Window wndSearch BackColor = &hFFFFFF Backdrop = "" CloseButton = True Composite = False Frame = 0 FullScreen = False HasBackColor = False Height = 600 ImplicitInstance= True LiveResize = False MacProcID = 0 MaxHeight = 32000 MaximizeButton = False MaxWidth = 32000 MenuBar = "" MenuBarVisible = True MinHeight = 64 MinimizeButton = True MinWidth = 64 Placement = 3 Resizeable = False Title = "Search [NAME]" Visible = True Width = 900 Begin ccSearch ccSearchBox AcceptFocus = "" AcceptTabs = True AutoDeactivate = True BackColor = 16777215 Backdrop = "" Enabled = True EraseBackground = True HasBackColor = False Height = 33 HelpTag = "" InitialParent = "" Left = 0 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = "" LockTop = True Scope = 0 TabIndex = 0 TabPanelIndex = 0 TabStop = True Top = 0 UseFocusRing = False Visible = True Width = 300 End Begin ccCancelSave CancelSave AcceptFocus = "" AcceptTabs = True AutoDeactivate = True BackColor = &hFFFFFF Backdrop = "" Enabled = True EraseBackground = True HasBackColor = False Height = 22 HelpTag = "" InitialParent = "" Left = 680 LockBottom = True LockedInPosition= False LockLeft = False LockRight = True LockTop = False Scope = 0 TabIndex = 1 TabPanelIndex = 0 TabStop = True Top = 558 UseFocusRing = "" Visible = True Width = 200 End Begin ListboxPRO lstResults AlternatingRows = True AutoDeactivate = True AutoHideScrollbars= True Bold = "" Border = True ColumnCount = 15 ColumnsResizable= "" ColumnWidths = "100%, 0" DataField = "" DataSource = "" DefaultRowHeight= 22 Enabled = True EnableDrag = "" EnableDragReorder= "" GridLinesHorizontal= 0 GridLinesVertical= 0 HasHeading = "" HeadingIndex = -1 Height = 513 HelpTag = "" Hierarchical = "" Index = -2147483648 InitialParent = "" InitialValue = "" Italic = "" Left = 0 LockBottom = True LockedInPosition= False LockLeft = True LockRight = "" LockTop = True RequiresSelection= False Scope = 0 ScrollbarHorizontal= "" ScrollBarVertical= True SelectionGradient= True SelectionType = 0 SourceList = False TabIndex = 2 TabPanelIndex = 0 TabStop = True TextFont = "System" TextSize = 12 TextUnit = 0 Top = 33 TypeToSearch = True Underline = "" UseFocusRing = False Visible = True Width = 300 _ScrollWidth = -1 End Begin MediaDetails cvsInfo AcceptFocus = "" AcceptTabs = "" AutoDeactivate = True Backdrop = "" DoubleBuffer = False Enabled = True EraseBackground = True Height = 546 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 300 LockBottom = True LockedInPosition= False LockLeft = True LockRight = True LockTop = True Scope = 0 TabIndex = 3 TabPanelIndex = 0 TabStop = True Top = 0 UseFocusRing = True Visible = True Width = 600 End Begin Thread ThrSearchMovieResult Height = 32 Index = -2147483648 Left = 934 LockedInPosition= False Priority = 5 Scope = 0 StackSize = 0 TabPanelIndex = 0 Top = 117 Width = 32 End Begin ProgressBar prgBar AutoDeactivate = True Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 312 LockBottom = True LockedInPosition= False LockLeft = True LockRight = "" LockTop = False Maximum = 0 Scope = 0 TabPanelIndex = 0 Top = 558 Value = 0 Visible = False Width = 356 End Begin PopupArrow popWeb AutoDeactivate = True Enabled = True Facing = 1 Height = 10 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 639 LockBottom = True LockedInPosition= False LockLeft = False LockRight = True LockTop = False Scope = 0 TabIndex = 4 TabPanelIndex = 0 TabStop = True Top = 638 Visible = True Width = 10 End Begin Thread ThrSearchTVResult Height = 32 Index = -2147483648 Left = 978 LockedInPosition= False Priority = 5 Scope = 0 StackSize = 0 TabPanelIndex = 0 Top = 117 Width = 32 End Begin PopupMenu popLinks AutoDeactivate = True Bold = "" DataField = "" DataSource = "" Enabled = True Height = 20 HelpTag = "" Index = -2147483648 InitialParent = "" InitialValue = "#Menu.CMMSearchTheWeb" Italic = "" Left = 20 ListIndex = 0 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = "" LockTop = True Scope = 0 TabIndex = 5 TabPanelIndex = 0 TabStop = True TextFont = "System" TextSize = 0 TextUnit = 0 Top = 558 Underline = "" Visible = True Width = 150 End End #tag EndWindow #tag WindowCode #tag Event Sub Close() ThrSearchTVResult.Kill ThrSearchMovieResult.Kill 'Sckt.Close wndMain.lstTVShows.Enabled = True wndMain.lstMovies.Enabled = True End Sub #tag EndEvent #tag Event Sub Open() 'self.bottomBorderThickness = 54 wndMain.lstTVShows.Enabled = False wndMain.lstMovies.Enabled = False Select Case ActiveSection Case 0 Self.Title = wTitleSearchMovie Case 1 Self.Title = wTitleSearchShow Case 2 Self.Title = wTitleSearchAnime End Select End Sub #tag EndEvent #tag MenuHandler Function FileCloseWindow() As Boolean Handles FileCloseWindow.Action Close Return True End Function #tag EndMenuHandler #tag Property, Flags = &h1 Protected Lindex As Integer = -1 #tag EndProperty #tag Constant, Name = kSearchFieldHelpText, Type = String, Dynamic = True, Default = \"Title (year) or IMDb ID", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Title (year) or IMDb ID" #Tag Instance, Platform = Any, Language = nl, Definition = \"Titel (jaar) of IMDb ID" #Tag Instance, Platform = Any, Language = sv, Definition = \"Titel (\xC3\xA5r) eller IMDb ID" #Tag Instance, Platform = Any, Language = de, Definition = \"Titel (Jahr) oder IMDb ID" #Tag Instance, Platform = Any, Language = fr, Definition = \"Titre (Ann\xC3\xA9e) ou IMDB ID" #tag EndConstant #tag Constant, Name = kUseIMDBID, Type = String, Dynamic = True, Default = \"Instead of key words\x2C you can also use an IMDb ID to search for a movie.", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Instead of key words\x2C you can also use an IMDb ID to search for a movie." #Tag Instance, Platform = Any, Language = nl, Definition = \"In plaats van sleutelwoorden\x2C kunt u ook een IMDb ID gebruiken om te zoeken naar een film." #Tag Instance, Platform = Any, Language = sv, Definition = \"Inst\xC3\xA4llet f\xC3\xB6r nyckelord kan du anv\xC3\xA4nda IMDb ID f\xC3\xB6r att s\xC3\xB6ka efter en film." #Tag Instance, Platform = Any, Language = de, Definition = \"Anstelle von Suchbegriffen kann auch eine IMDb ID dazu genutzt werden um nach einem Film zu suchen." #Tag Instance, Platform = Any, Language = fr, Definition = \"Au lieu de mots cl\xC3\xA9s\x2C vous pouvez aussi utiliser l\'ID IMDB pour trouver un film." #tag EndConstant #tag Constant, Name = wTitleSearchAnime, Type = String, Dynamic = True, Default = \"Search Anime", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Search Anime" #Tag Instance, Platform = Any, Language = nl, Definition = \"Zoek Anime" #Tag Instance, Platform = Any, Language = de, Definition = \"Anime suchen" #Tag Instance, Platform = Any, Language = sv, Definition = \"S\xC3\xB6k tecknat" #Tag Instance, Platform = Any, Language = fr, Definition = \"Rechercher un anime" #tag EndConstant #tag Constant, Name = wTitleSearchMovie, Type = String, Dynamic = True, Default = \"Search Movies", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Search Movies" #Tag Instance, Platform = Any, Language = nl, Definition = \"Zoek Films" #Tag Instance, Platform = Any, Language = sv, Definition = \"S\xC3\xB6k filmer" #Tag Instance, Platform = Any, Language = de, Definition = \"Film suchen" #Tag Instance, Platform = Any, Language = fr, Definition = \"Rechercher un film" #tag EndConstant #tag Constant, Name = wTitleSearchShow, Type = String, Dynamic = True, Default = \"Search TV Shows", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Search Shows" #Tag Instance, Platform = Any, Language = nl, Definition = \"Zoek Series" #Tag Instance, Platform = Any, Language = de, Definition = \"Serie suchen" #Tag Instance, Platform = Any, Language = sv, Definition = \"S\xC3\xB6k TV-serier" #Tag Instance, Platform = Any, Language = fr, Definition = \"Rechercher une S\xC3\xA9rie TV" #tag EndConstant #tag EndWindowCode #tag Events ccSearchBox #tag Event Function KeyDown(Key As String) As Boolean If Asc(Key) = 13 Then Return True End Function #tag EndEvent #tag Event Sub Open() If ActiveSection <= 1 Then Me.edtSearch.CueText = kSearchFieldHelpText Me.edtSearch.HelpTag = kUseIMDBID End If End Sub #tag EndEvent #tag Event Sub ResetSearch() Me.edtSearch.Text = "" End Sub #tag EndEvent #tag Event Sub DoSearch(SearchText as String) If Trim(SearchText) = "" Then Return Dim ID as String = Trim( match( "[0-9]*", SearchText ) ) If ID.Len >= 5 Then Self.Close dlgProgress.SpecialInit( ID, lstResults.Cell( lstResults.ListIndex, 0 ) ) ElseIf SearchText.Left(2) = "tt" OR SearchText.Left(3) = "id:" Then Self.Close dlgProgress.SpecialInit( Trim( SearchText.ReplaceAll("id:","") ), lstResults.Cell( lstResults.ListIndex, 0 ) ) Else If ActiveSection = 0 Then dlgProgress.Start( Loc.kSearching + ":", SearchText, 0, "ManualSearchMovie" ) If ActiveSection = 1 Then dlgProgress.Start( Loc.kSearching + ":", SearchText, 0, "ManualSearchTVShow" ) End If End Sub #tag EndEvent #tag EndEvents #tag Events CancelSave #tag Event Sub ActionCancel() dlgProgress.Close Close End Sub #tag EndEvent #tag Event Sub ActionOK() Dim ID as String = lstResults.Cell( lstResults.ListIndex, 2 ) If ID = "" Then ID = lstResults.Cell( lstResults.ListIndex, 1 ) Dim Name as String = lstResults.Cell( lstResults.ListIndex, 0 ) dlgProgress.Close Dim FolderParent as FolderItem If ActiveSection = 0 Then FolderParent = MovieAttr.FolderParent If ActiveSection = 1 Then FolderParent = TVAttr.FolderParent Self.Close If PriorArtFound( FolderParent ) Then If Prefs.integerForKey("KeepImages") = 0 Then // Ask First Dim i as Integer = MsgDlg( Nil, 1, MovieCore.msgPriorMovieArtFound.ReplaceAll( "<movie>", CurrentItemName ), MovieCore.msgPriorArtDeletion, MovieCore.btnReplaceExistingArtwork, Loc.dlgCancel, MovieCore.btnDownloadMissingArtwork ) If i = 1 Then PriorArtDelete( FolderParent ) If i = 2 Then Return ElseIf Prefs.integerForKey("KeepImages") = 1 Then // Always PriorArtDelete( FolderParent ) End If End If dlgProgress.SpecialInit( ID, Name ) 'If ActiveSection = 0 Then dlgProgress.SpecialInit( ID, Name ) 'If ActiveSection = 1 Then dlgProgress.SpecialInit( ID, Name ) End Sub #tag EndEvent #tag Event Sub Open() me.btnRight.Default = False End Sub #tag EndEvent #tag EndEvents #tag Events lstResults #tag Event Sub DoubleClick() If Me.ListIndex > -1 Then CancelSave.btnRight.Push End Sub #tag EndEvent #tag Event Function KeyDown(Key As String) As Boolean If Keyboard.AsyncKeyDown( &h4C ) or Keyboard.AsyncKeyDown( &h24 ) then // Pressed Enter If Me.ListIndex > -1 then CancelSave.btnRight.Push ElseIf Keyboard.AsyncKeyDown( &h35 ) then // Pressed Escape CancelSave.btnLeft.Push End If End Function #tag EndEvent #tag Event Sub Change() CancelSave.btnRight.Enabled = ( Me.ListIndex > -1 ) If Me.ListIndex = Lindex Then Return ThrSearchMovieResult.Kill ThrSearchTVResult.Kill If ActiveSection = 0 Then ThrSearchMovieResult.Run If ActiveSection = 1 Then ThrSearchTVResult.Run Lindex = Me.ListIndex End Sub #tag EndEvent #tag EndEvents #tag Events cvsInfo #tag Event Sub Paint(g As Graphics, areas() As REALbasic.Rect) If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = &c000000 g.FillRect 0, 0, me.Width, me.Height // ## Backdrop If lstResults.ListIndex < 0 Then Me.DrawBackdrop( g, Nil ) // #### Return if there's nothing selected If lstResults.ListIndex < 0 Then Return // ## Backdrop Me.DrawBackdrop( g, lstResults.CellTag( lstResults.ListIndex, 6 ) ) // ## Poster Me.DrawPoster( g, lstResults.CellTag( lstResults.ListIndex, 5 ) ) // ## Write Dim TextTop as Integer = 13 Dim TextLeft as Integer = 20 If lstResults.CellTag( lstResults.ListIndex, 5 ) <> Nil Then TextLeft = 184 // -- Title g.TextSize = 16 g.Bold = True TextTop = TextTop + g.TextSize Dim Title as String = lstResults.Cell( lstResults.ListIndex, 3 ) Dim DateYear as Integer = Val( lstResults.Cell( lstResults.ListIndex, 4 ).Left(4) ) If DateYear < 1000 Then DateYear = Val( lstResults.Cell( lstResults.ListIndex, 4 ).Right(4) ) Dim DisplayTitle as String = Title If DateYear > 1000 And ActiveSection = 0 Then DisplayTitle = Title + " (" + Str( DateYear ) + ")" If Title <> "" Then If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString DisplayTitle, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c333333 Else g.ForeColor = RGBa( 100, 100, 100, .8 ) g.DrawString DisplayTitle, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + g.StringHeight( DisplayTitle, Me.Width - TextLeft - 20 ) - 2 End If // -- Original Title Dim OriginalTitle as String = lstResults.Cell( lstResults.ListIndex, 13 ) If OriginalTitle <> "" And lstResults.Cell( lstResults.ListIndex, 3 ) <> OriginalTitle Then g.TextSize = 14 If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString OriginalTitle, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c666666 Else g.ForeColor = RGBa( 100, 100, 100, .6 ) g.DrawString OriginalTitle, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + g.StringHeight( OriginalTitle, Me.Width - TextLeft - 20 ) End If // -- Tagline g.Bold = False g.TextSize = 12 g.Italic = True Dim Tagline as String = lstResults.Cell( lstResults.ListIndex, 8 ) If Tagline <> "" Then If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString Tagline, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c33333340 Else g.ForeColor = RGBa( 80, 80, 80, .75 ) g.DrawString Tagline, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + 4 + g.StringHeight( Tagline, Me.Width - TextLeft - 20 ) End If // -- Duration - Genre(s) - Premiere Dim SubTagLine as String g.Italic = False Dim Duration as String = lstResults.Cell( lstResults.ListIndex, 10 ) Dim Genres as String = lstResults.Cell( lstResults.ListIndex, 11 ) Dim Premiere as String = lstResults.Cell( lstResults.ListIndex, 4 ) // Duration If Val( Duration ) > 0 Then If Val( Duration ) > 60 Then SubTagLine = PrettyTime( Val( Duration ) ) Else SubTagLine = Duration + Trim( loc.kMinutesShort ).Left(1) End If End If If SubTagLine <> "" And Genres <> "" Then SubTagLine = SubTagLine + " - " If Genres <> "" Then SubTagLine = SubTagLine + Genres If SubTagLine <> "" And Premiere <> "" Then SubTagLine = SubTagLine + " - " If Premiere <> "" And Premiere <> "False" Then SubTagLine = SubTagLine + PrettyDate( Premiere ) // -- Write SubTagLine If SubTagLine <> "" Then If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString SubTagLine, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c555555 Else g.ForeColor = RGBa( 100, 100, 100, .67 ) g.DrawString SubTagLine, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + g.StringHeight( SubTagLine, Me.Width - TextLeft - 20 ) + g.TextSize End If // ## Write Plot Dim Plot as String = lstResults.Cell( lstResults.Listindex, 9 ) If Plot <> "" Then If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString Plot, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c333333 Else g.ForeColor = RGBa( 100, 100, 100, .8 ) g.DrawString Plot, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + g.StringHeight( Plot, Me.Width - TextLeft - 20 ) + 12 End If // ## Write Path Dim path as String If ActiveSection = 0 Then path = MovieAttr.FolderParent.ShellPath.ReplaceAll("\","") If ActiveSection = 1 Then path = TVAttr.FolderParent.ShellPath.ReplaceAll("\","") TextTop = Me.Height - g.StringHeight( path, Me.Width - 40 ) If lstResults.CellTag( lstResults.ListIndex, 7 ) <> Nil Then TextTop = TextTop - 100 If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString path, 20, TextTop, Me.Width - 40, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c666666 Else g.ForeColor = RGBa( 100, 100, 100, .6 ) g.DrawString path, 20, TextTop, Me.Width - 40, False Me.DrawBanner( g, lstResults.CellTag( lstResults.ListIndex, 7 ) ) // ## Borders g.ForeColor = &cC3C3C3 g.DrawLine 0, 0, me.Width, 0 g.DrawLine 0, me.Height - 1, me.Width, me.Height - 1 End Sub #tag EndEvent #tag EndEvents #tag Events ThrSearchMovieResult #tag Event Sub Run() prgBar.Visible = False cvsInfo.Reload If lstResults.ListIndex = -1 Then Return Dim Lang as String = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) Dim ID as String = lstResults.Cell( lstResults.ListIndex, 1 ) // IMDB ID If ID = "" Then ID = lstResults.Cell( lstResults.ListIndex, 2 ) // TMDB ID If ID = "" Then Return // ## If no previous data has been fetched If lstResults.CellTag( lstResults.ListIndex, 5 ) <> Nil And lstResults.CellTag( lstResults.ListIndex, 6 ) <> Nil Then Return Dim Sckt as New MovieSckt Sckt.Yield = True prgBar.Visible = True prgBar.Maximum = 6 prgBar.Value = 0 prgBar.Value = prgBar.Value + 1 // ## Local Info JSON Dim JSONString as String = DefineEncoding( Sckt.Get( Sckt.URL("MovieInfo", lstResults.Cell( lstResults.ListIndex, 1 ), Prefs.stringForKey("DBLanguage") ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) Sckt.Close 'JSONString = DecodingFromHTMLMBS( JSONString ) Dim TMDBLocal as New JSONItem If JSONString.ValidJSON("TMDb Local") Then TMDBLocal.Load JSONString JSONString = "" prgBar.Value = prgBar.Value + 1 // ## US Info JSON Dim TMDBUS as New JSONItem If NOT TMDBLocal.HasName("status_message") And Lang.instr( 0, "en" ) = 0 Then JSONString = DefineEncoding( Sckt.Get( Sckt.URL("MovieInfo", lstResults.Cell( lstResults.ListIndex, 1 ), "en" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) If JSONString.ValidJSON("TMDb US") Then TMDBUS.load JSONString JSONString = "" End If prgBar.Value = prgBar.Value + 1 // ## IMDb Info JSON Dim IMDb as New JSONItem If ID.Left(2) = "tt" And NOT TMDBLocal.HasName("imdb_id") Then IMDb = GetIMDbJSON( ID, True ) 'JSONString = DefineEncoding( IMDBjson( ID, True ), Encodings.UTF8 ) 'If JSONString.ValidJSON( "IMDb" ) Then IMDB.Load JSONString End If // :0 Display Title / :1 IMDb / :2 Database ID / :3 Original Title / :4 ReleaseDate / :5 PosterURL / :6 FanartURL / :7 BannerURL // :0 Display Title // :1 IMDb ID If lstResults.Cell( lstResults.ListIndex, 1 ) = "" And TMDBLocal.HasName("imdb_id") And TMDBLocal.Value("imdb_id") <> "" Then lstResults.Cell( lstResults.ListIndex, 1 ) = TMDBLocal.Value("imdb_id") End If // :2 TMDb ID If lstResults.Cell( lstResults.ListIndex, 2 ) = "" And TMDBLocal.HasName("id") And TMDBLocal.Value("id") <> "" Then lstResults.Cell( lstResults.ListIndex, 2 ) = TMDBLocal.Value("id") End If // :3 Title Dim DisplayName as String If TMDBUS.HasName("title") And TMDBUS.Value("title") <> "" Then DisplayName = TMDBUS.Value("title") If IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then DisplayName = IMDb.Value("TITLE") If TMDBLocal.HasName("title") And TMDBLocal.Value("title") <> "" Then DisplayName = TMDBLocal.Value("title") lstResults.Cell( lstResults.ListIndex, 3 ) = ReplaceAll( DisplayName, "&", "&" ) // :4 Release Date If IMDb.HasName("RELEASE_DATE") And IMDb.Value("RELEASE_DATE") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = IMDb.Value("RELEASE_DATE") If TMDBUS.HasName("release_date") And TMDBUS.Value("release_date") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = TMDBUS.Value("release_date") If TMDBLocal.HasName("release_date") And TMDBLocal.Value("release_date") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = TMDBLocal.Value("release_date") // 5: PosterURL Dim PosterURL as String = lstResults.Cell( lstResults.ListIndex, 5 ) // 6: FanartURL Dim FanartURL as String = lstResults.Cell( lstResults.ListIndex, 6 ) // 7: BannerURL Dim BannerURL as String = lstResults.Cell( lstResults.ListIndex, 7 ) // 8: Tagline If TMDBUS.HasName("tagline") And TMDBUS.value("tagline") <> "" Then lstResults.Cell( lstResults.ListIndex, 8 ) = TMDBUS.Value("tagline") // U.S. Backup If IMDb.HasName("TAGLINE") And IMDb.Value("TAGLINE") <> "" Then lstResults.Cell( lstResults.ListIndex, 8 ) = IMDb.Value("TAGLINE") If TMDBLocal.HasName("tagline") And TMDBLocal.Value("tagline") <> "" Then lstResults.Cell( lstResults.ListIndex, 8 ) = TMDBLocal.Value("tagline") // Local // 9: Plot If TMDBUS.HasName("overview") And TMDBUS.Value("overview") <> "" Then lstResults.Cell( lstResults.ListIndex, 9 ) = DecodingFromHTMLMBS( TMDBUS.Value("overview") ) // U.S. Backup If IMDb.HasName("STORYLINE") And IMDb.Value("STORYLINE") <> "" Then lstResults.Cell( lstResults.ListIndex, 9 ) = DecodingFromHTMLMBS( IMDb.Value("STORYLINE") ) If TMDBLocal.HasName("overview") And TMDBLocal.Value("overview") <> "" Then lstResults.Cell( lstResults.ListIndex, 9 ) = DecodingFromHTMLMBS( TMDBLocal.Value("overview") ) // Local // 10: Runtime If TMDBUS.HasName("runtime") And TMDBUS.Value("runtime") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = TMDBUS.Value("runtime") If TMDBLocal.HasName("runtime") And TMDBLocal.Value("runtime") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = TMDBLocal.Value("runtime") // 11: Genres If TMDBLocal.HasName("genres") And TMDBLocal.Child("genres").Count > 0 Then Dim genres as String For i as Integer = 0 To TMDBLocal.Child("genres").Count - 1 If i = 3 Then Exit If genres = "" Then genres = TMDBLocal.Child("genres").Child(i).Value("name") Else genres = genres + " | " + TMDBLocal.Child("genres").Child(i).Value("name") End If Next lstResults.Cell( lstResults.ListIndex, 11 ) = genres End If // 12: Rating If TMDBUS.HasName("vote_average") And TMDBUS.Value("vote_average") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = Str( Round( TMDBUS.Value("vote_average") * 10 ) / 10 ) If IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = Str( IMDb.Value("RATING") ) // 13: Original Title Dim OriginalTitle as String If TMDBLocal.HasName("original_title") And TMDBLocal.Value("original_title") <> "" Then OriginalTitle = TMDBLocal.Value("original_title") If IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then OriginalTitle = IMDb.Value("TITLE") If IMDb.HasName("ORIGINAL_TITLE") And IMDb.Value("ORIGINAL_TITLE") <> "" Then OriginalTitle = IMDb.Value("ORIGINAL_TITLE") If TMDBUS.HasName("title") And TMDBUS.Value("title") <> "" Then OriginalTitle = TMDBUS.Value("title") lstResults.Cell( lstResults.ListIndex, 13 ) = OriginalTitle // 14: MPAA Rating If IMDb.HasName("MPAA_RATING") And IMDb.Value("MPAA_RATING") = "" Then lstResults.Cell( lstResults.ListIndex, 14 ) = IMDb.Value("MPAA_RATING") // 15: = Homepage If TMDBUS.HasName("homepage") And TMDBUS.Value("homepage") <> "" Then lstResults.Cell( lstResults.ListIndex, 15 ) = TMDBUS.Value("homepage") If TMDBLocal.HasName("homepage") And TMDBLocal.Value("homepage") <> "" Then lstResults.Cell( lstResults.ListIndex, 15 ) = TMDBLocal.Value("homepage") // Get Poster IMG prgBar.Value = prgBar.Value + 1 If PosterURL <> "" And PosterURL.Left(4) = "http" Then lstResults.CellTag( lstResults.ListIndex, 5 ) = Picture.FromData( Sckt.Get( PosterURL, Prefs.IntegerForKey("TimeOut") ) ) End If // Get Backdrop IMG prgBar.Value = prgBar.Value + 1 If FanartURL <> "" And FanartURL.Left(4) = "http" Then lstResults.CellTag( lstResults.ListIndex, 6 ) = Picture.FromData( Sckt.Get( FanartURL, Prefs.integerForKey("TimeOut") ) ) End If // Get Banner IMG prgBar.Value = prgBar.Value + 1 If BannerURL <> "" And BannerURL.Left(4) = "http" Then lstResults.CellTag( lstResults.ListIndex, 7 ) = Picture.FromData( Sckt.Get( BannerURL, Prefs.integerForKey("TimeOut") ) ) End If Sckt.Close cvsInfo.Reload prgBar.Visible = False End Sub #tag EndEvent #tag EndEvents #tag Events popWeb #tag Event Function MouseDown(X As Integer, Y As Integer) As Boolean If X > 0 And Y > 0 And _ X < Me.Width And Y < Me.Width Then Return True End If End Function #tag EndEvent #tag Event Sub MouseUp(X As Integer, Y As Integer) If X < 0 And Y < 0 And _ X > Me.Width And Y > Me.Width Then Return If lstResults.ListIndex = -1 Then Return Dim imdbID as String = lstResults.Cell( lstResults.ListIndex, 1 ) Dim tmdbID as String = lstResults.Cell( lstResults.ListIndex, 2 ) Dim Title as String = lstResults.Cell( lstResults.ListIndex, 3 ) Dim TitleOriginal as String = lstResults.Cell( lstResults.ListIndex, 13 ) Dim ReleaseDate as String = lstResults.Cell( lstResults.ListIndex, 4 ) Dim HomePageURL as String = lstResults.Cell( lstResults.ListIndex, 15 ) PopUpWebMenu imdbID, tmdbID, Title, TitleOriginal, ReleaseDate, HomePageURL End Sub #tag EndEvent #tag EndEvents #tag Events ThrSearchTVResult #tag Event Sub Run() prgBar.Visible = False cvsInfo.Reload If lstResults.ListIndex = -1 Then Return Dim Lang as String = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) Dim ID as String = lstResults.Cell( lstResults.ListIndex, 2 ) // TVDB ID If ID = "" Then ID = lstResults.Cell( lstResults.ListIndex, 1 ) // IMDb ID If ID = "" Then Return // ## If no previous data has been fetched If lstResults.CellTag( lstResults.ListIndex, 5 ) <> Nil And lstResults.CellTag( lstResults.ListIndex, 6 ) <> Nil Then Return Dim sckt as New TVDBSckt sckt.Yield = True Dim JSONString as String prgBar.Visible = True prgBar.Maximum = 8 prgBar.Value = 0 prgBar.Value = prgBar.Value + 1 // ## If IMDb ID If ID.Left(2) = "tt" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "InfoAlias", ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'JSONString = DecodingFromHTMLMBS( JSONString ) 'JSONString = JSONString.XML2JSON Dim TVDBAlias as New JSONItem 'If JSONString.ValidJSON("TVDB Alias") Then TVDBAlias.Load JSONString TVDBAlias = JSONString.XML2JSON If TVDBAlias <> Nil And TVDBAlias.HasName("Data") And TVDBAlias.ToString.InStr( 0, "Series" ) <> 0 And TVDBAlias.Child("Data").HasName("Series") And TVDBAlias.Child("Data").Child("Series").HasName("id") Then ID = TVDBAlias.Child("Data").Child("Series").Value("id") JSONString = "" End If prgBar.Value = prgBar.Value + 1 // ## Local Info JSON If ID.Left(2) <> "tt" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'JSONString = DecodingFromHTMLMBS( JSONString ) 'JSONString = JSONString.XML2JSON End If Dim TVDBLocal as New JSONItem 'If JSONString.ValidJSON("TVDB Local", True) Then TVDBLocal.Load JSONString TVDBLocal = JSONString.XML2JSON If TVDBLocal <> Nil And TVDBLocal.HasName("Data") And TVDBLocal.Child("Data").HasName("Series") Then TVDBLocal.Load TVDBLocal.Child("Data").Child("Series").ToString JSONString = "" prgBar.Value = prgBar.Value + 1 // ## US Info JSON If ID.Left(2) <> "tt" And Lang <> "en" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID, "en" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'JSONString = DecodingFromHTMLMBS( JSONString ) 'JSONString = JSONString.XML2JSON End If Dim TVDBUS as New JSONItem If Lang <> "en" Then 'If JSONString.ValidJSON("TVDB US") Then TVDBUS.Load JSONString TVDBUS = JSONString.XML2JSON If TVDBUS.HasName("Data") And TVDBUS.Child("Data").HasName("Series") Then TVDBUS.Load TVDBUS.Child("Data").Child("Series").ToString JSONString = "" End If prgBar.Value = prgBar.Value + 1 // ## IMDb JSON Dim IMDb as New JSONItem If ID.Left(2) = "tt" And ( TVDBLocal <> Nil And TVDBLocal.HasName("Data") And TVDBLocal.Value("Data") = "" ) Then IMDb = GetIMDbJSON( ID, True ) 'JSONString = IMDBjson( ID, True ) 'If JSONString.ValidJSON("IMDb") Then IMDb.Load JSONString 'JSONString = "" End If prgBar.Value = prgBar.Value + 1 // ## Set cells // :0 Display Title // :1 IMDb ID If lstResults.Cell( lstResults.ListIndex, 1 ) = "" And TVDBLocal <> Nil And TVDBLocal.HasName("IMDB_ID") And TVDBLocal.Value("IMDB_ID") <> "" Then lstResults.Cell( lstResults.ListIndex, 1 ) = TVDBLocal.Value("IMDB_ID") // :2 TVDB ID If IMDb <> Nil And IMDb.HasName("TITLE_ID") And IMDb.Value("TITLE_ID") <> "" Then lstResults.Cell( lstResults.ListIndex, 2 ) = IMDb.Value("TITLE_ID") If TVDBLocal <> Nil And TVDBLocal.HasName("id") And TVDBLocal.Value("id") <> "" Then lstResults.Cell( lstResults.ListIndex, 2 ) = TVDBLocal.Value("id") // :3 Title If imdb <> Nil And IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then lstResults.Cell( lstResults.ListIndex, 3 ) = IMDb.Value("TITLE") If TVDBUS <> Nil And TVDBUS.HasName("SeriesName") And TVDBUS.Value("SeriesName") <> "" Then lstResults.Cell( lstResults.ListIndex, 3 ) = TVDBUS.Value("SeriesName") If TVDBLocal <> Nil And TVDBLocal.HasName("SeriesName") And TVDBLocal.Value("SeriesName") <> "" Then lstResults.Cell( lstResults.ListIndex, 3 ) = TVDBLocal.Value("SeriesName") lstResults.Cell( lstResults.ListIndex, 3 ) = ReplaceAll( lstResults.Cell( lstResults.ListIndex, 3 ), "&", "&" ) // :4 Release Date If IMDb <> Nil And IMDb.HasName("RELEASE_DATE") And IMDb.Value("RELEASE_DATE") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = IMDb.Value("RELEASE_DATE") If TVDBUS <> Nil And TVDBUS.HasName("FirstAired") And TVDBUS.Value("FirstAired") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = TVDBUS.Value("FirstAired") If TVDBLocal <> Nil And TVDBLocal.HasName("FirstAired") And TVDBLocal.Value("FirstAired") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = TVDBLocal.Value("FirstAired") // :5 Poster URL Dim PosterURL as String = lstResults.Cell( lstResults.ListIndex, 5 ) If IMDb <> Nil And IMDb.HasName("POSTER") And IMDb.Value("POSTER") <> "" Then PosterURL = IMDb.Value("POSTER") If TVDBUS <> Nil And TVDBUS.HasName("poster") And TVDBUS.Value("poster") <> "" Then PosterURL = TVDBUS.Value("poster") If TVDBLocal <> Nil And TVDBLocal.HasName("poster") And TVDBLocal.Value("poster") <> "" Then PosterURL = TVDBLocal.Value("poster") If PosterURL.Left(4) <> "http" then PosterURL = "http://www.thetvdb.com/banners/_cache/" + PosterURL lstResults.Cell( lstResults.ListIndex, 5 ) = PosterURL // :6 Fanart URL Dim FanartURL as String = lstResults.Cell( lstResults.ListIndex, 6 ) If IMDb <> Nil And IMDb.HasName("MEDIA_IMAGES") And IMDb.Child("MEDIA_IMAGES").Count > 1 Then FanartURL = IMDb.Child("MEDIA_IMAGES").Value(0) If TVDBUS <> Nil And TVDBUS.HasName("fanart") And TVDBUS.Value("fanart") <> "" Then FanartURL = TVDBUS.Value("fanart") If TVDBLocal <> Nil And TVDBLocal.HasName("fanart") And TVDBLocal.Value("fanart") <> "" Then FanartURL = TVDBLocal.Value("fanart") If FanartURL.Left(4) <> "http" Then FanartURL = "http://www.thetvdb.com/banners/_cache/" + FanartURL lstResults.Cell( lstResults.ListIndex, 6 ) = FanartURL // :7 Banner URL Dim BannerURL as String = lstResults.Cell( lstResults.ListIndex, 7 ) If TVDBUS <> Nil And TVDBUS.HasName("banner") And TVDBUS.Value("banner") <> "" Then BannerURL = TVDBUS.Value("banner") If TVDBLocal <> Nil And TVDBLocal.HasName("banner") And TVDBLocal.Value("banner") <> "" Then BannerURL = TVDBLocal.Value("banner") If BannerURL.Left(4) <> "http" Then BannerURL = "http://www.thetvdb.com/banners/" + BannerURL lstResults.Cell( lstResults.ListIndex, 7 ) = BannerURL // :8 Tagline Dim Tagline as String '= lstResults.Cell( lstResults.ListIndex, 8 ) If TVDBUS <> Nil And TVDBUS.HasName("Network") And TVDBUS.Value("Network") <> "" Then Tagline = TVDBUS.Value("Network") If TVDBLocal <> Nil And TVDBLocal.HasName("Network") And TVDBLocal.Value("Network") <> "" Then Tagline = TVDBLocal.Value("Network") If IMDb <> Nil And IMDb.HasName("TAGLINE") And IMDb.Value("TAGLINE") <> "" Then Tagline = IMDb.Value("TAGLINE") If TVDBLocal <> Nil And TVDBLocal.HasName("Status") And TVDBLocal.Value("Status") <> "" Then Tagline = Tagline + " | " + TVDBLocal.Value("Status") lstResults.Cell( lstResults.ListIndex, 8 ) = Tagline // :9 Plot If IMDb <> Nil And IMDb.HasName("STORYLINE") And IMDb.Value("STORYLINE") <> "" Then lstResults.Cell( lstResults.ListIndex, 9 ) = DecodingFromHTMLMBS( IMDb.Value("STORYLINE") ) If TVDBUS <> Nil And TVDBUS.HasName("Overview") And TVDBUS.Value("Overview") <> "" Then lstResults.Cell( lstResults.ListIndex, 9 ) = DecodingFromHTMLMBS( TVDBUS.Value("Overview") ) If TVDBLocal <> Nil And TVDBLocal.HasName("Overview") And TVDBLocal.Value("Overview") <> "" Then lstResults.Cell( lstResults.ListIndex, 9 ) = DecodingFromHTMLMBS( TVDBLocal.Value("Overview") ) // :10 Runtime If IMDb <> Nil And IMDb.HasName("RUNTIME") And IMDb.Value("RUNTIME") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = IMDb.Value("RUNTIME") If TVDBUS <> Nil And TVDBUS.HasName("Runtime") And TVDBUS.Value("Runtime") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = TVDBUS.Value("Runtime") If TVDBLocal <> Nil And TVDBLocal.HasName("Runtime") And TVDBLocal.Value("Runtime") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = TVDBLocal.Value("Runtime") // :11 Genres Dim Genres as String If TVDBUS <> Nil And TVDBUS.HasName("Genre") And TVDBUS.Value("Genre") <> "" Then Genres = TVDBUS.Value("Genre") If TVDBLocal <> Nil And TVDBLocal.HasName("Genre") And TVDBLocal.Value("Genre") <> "" Then Genres = TVDBLocal.Value("Genre") Genres = Trim( Genres.ReplaceAll("|", " | ").ReplaceAll(" and ", " & " ) ) Genres = Genres.Left( Genres.Len - 2 ) Genres = Genres.Right( Genres.Len - 2 ) lstResults.Cell( lstResults.ListIndex, 11 ) = Genres // :12 Rating If IMDb <> Nil And IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = IMDb.Value("RATING") If TVDBUS <> Nil And TVDBUS.HasName("Rating") And TVDBUS.Value("Rating") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = TVDBUS.Value("Rating") If TVDBLocal <> Nil And TVDBLocal.HasName("Rating") And TVDBLocal.Value("Rating") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = TVDBLocal.Value("Rating") // :13 Original Title If IMDb <> Nil And IMDb.HasName("ORIGINAL_TITLE") And IMDb.Value("ORIGINAL_TITLE") <> "" Then lstResults.Cell( lstResults.ListIndex, 13 ) = IMDb.Value("ORIGINAL_TITLE") // 14: MPAA Rating If TVDBUS <> Nil And TVDBUS.HasName("ContentRating") And TVDBUS.Value("ContentRating") <> "" Then lstResults.Cell( lstResults.ListIndex, 14 ) = TVDBUS.Value("ContentRating") If IMDb <> Nil And IMDb.HasName("MPAA_RATING") And IMDb.Value("MPAA_RATING") = "" Then lstResults.Cell( lstResults.ListIndex, 14 ) = IMDb.Value("MPAA_RATING") If TVDBLocal <> Nil And TVDBLocal.HasName("ContentRating") And TVDBLocal.Value("ContentRating") <> "" Then lstResults.Cell( lstResults.ListIndex, 14 ) = TVDBLocal.Value("ContentRating") cvsInfo.Reload // Get Banner IMG prgBar.Value = prgBar.Value + 1 If BannerURL <> "" And BannerURL.Left(4) = "http" Then lstResults.CellTag( lstResults.ListIndex, 7 ) = Picture.FromData( Sckt.Get( BannerURL, Prefs.integerForKey("TimeOut") ) ) End If cvsInfo.Reload // Get Poster IMG prgBar.Value = prgBar.Value + 1 If PosterURL <> "" And PosterURL.Left(4) = "http" Then 'If ActiveSection = 0 Then lstResults.CellTag( lstResults.ListIndex, 5 ) = Picture.FromData( Sckt.Get( PosterURL, Prefs.IntegerForKey("TimeOut") ) ) End If cvsInfo.Reload // Get Backdrop IMG prgBar.Value = prgBar.Value + 1 If FanartURL <> "" And FanartURL.Left(4) = "http" Then 'If ActiveSection = 0 Then lstResults.CellTag( lstResults.ListIndex, 6 ) = Picture.FromData( Sckt.Get( FanartURL, Prefs.integerForKey("TimeOut") ) ) End If sckt.Close cvsInfo.Reload prgBar.Visible = False End Sub #tag EndEvent #tag EndEvents #tag Events popLinks #tag Event Sub Open() Me.PullsDown = True 'Me.BezelStyle = PopupMenuExtension.NSBezelStyle.NSTexturedRoundedBezelStyle End Sub #tag EndEvent #tag Event Function MouseDown(X As Integer, Y As Integer) As Boolean Me.DeleteAllRows Me.AddRow Menu.CMMSearchTheWeb Dim HomePageURL, IMDbID, DBID, SearchTitle as String IMDbID = lstResults.Cell( lstResults.ListIndex, 1 ) DBID = lstResults.Cell( lstResults.ListIndex, 2 ) SearchTitle = lstResults.Cell( lstResults.ListIndex, 3 ) If SearchTitle = "" Then SearchTitle = lstResults.Cell( lstResults.ListIndex, 13 ) SearchTitle = EncodingToURLMBS( SearchTitle ) // Homepage If HomePageURL <> "" Then Me.AddNewRow "Homepage", HomePageURL Me.AddRow "-" End If // IMDB ID If IMDbID.Left(2) = "tt" Then Me.AddNewRow "IMDb", "http://www.imdb.com/title/" + IMDbID, ScaleImage( icoimdb, 16, 16 ) // Database ID If DBID <> "" And DBID.Left(2) <> "tt" And ActiveSection = 0 Then Me.AddNewRow "TMDb", "http://www.themoviedb.org/movie/" + DBID, ScaleImage( icotmdb, 16, 16 ) ElseIf DBID <> "" And DBID.Left(2) <> "tt" And ActiveSection = 1 Then Me.AddNewRow "TVDB", "http://thetvdb.com/?tab=series&id=" + DBID, ScaleImage( icotvdb, 16, 16 ) End If // Search If SearchTitle <> "" Then Me.AddNewRow "Wikipedia", "http://en.wikipedia.org/wiki/Special:Search?search=" + SearchTitle, ScaleImage( icowikipedia, 16, 16 ) If ActiveSection = 0 Then Me.AddNewRow "RottenTomatoes", "http://www.rottentomatoes.com/search/?search=" + SearchTitle, ScaleImage( icorottentomatoes, 16, 16 ) Me.AddNewRow "YouTube", "http://www.youtube.com/results?search_query=" + SearchTitle, ScaleImage( icoyoutube, 16, 16 ) Me.AddNewRow "Netflix", "http://www.netflix.com/Search?v1=" + SearchTitle, ScaleImage( iconetflix, 16, 16 ) End If End If // Torrentz If Keyboard.AsyncAltKey And SearchTitle <> "" Then Me.AddRow "-" Me.AddNewRow "The PirateBay", "http://pirateproxy.net/search/" + SearchTitle, ScaleImage( icotpb, 16, 16 ) Me.AddNewRow "Torrentz", "http://torrentz.eu/search?q=" + SearchTitle, ScaleImage( icotorrentz, 16, 16 ) Me.AddNewRow "KickAssTorrents", "http://kickass.to/usearch/" + SearchTitle, ScaleImage( icokat, 16, 16 ) If ActiveSection = 0 Then Me.AddNewRow "Movies.io", "http://movies.io/m/search?utf8=✓&q=" + SearchTitle, ScaleImage( icomoviesio, 16, 16 ) Me.AddNewRow "YIFY Torrents", "http://yify-torrents.com/browse-movie/" + SearchTitle, ScaleImage( icoyify, 16, 16 ) End If End If // Buy Legally If SearchTitle <> "" Then Me.AddRow "-" Me.AddNewRow "eBay", "http://shop.ebay.com/?_from=R40&_trksid=p5197.m570.l1313&_nkw=" + SearchTitle + "&_sacat=See-All-Categories", ScaleImage( icoebay, 16, 16 ) Me.AddNewRow "Amazon.com", "http://www.amazon.com/s/vime03-20/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=" + SearchTitle + "&x=0&y=0", ScaleImage( icoamazon, 16, 16 ) Me.AddNewRow "Amazon.co.uk", "http://www.amazon.co.uk/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=" + SearchTitle + "&x=0&y=0", ScaleImage( icoamazon, 16, 16 ) End If End Function #tag EndEvent #tag Event Sub Change() If Me.RowTag( Me.ListIndex ) <> Nil Then ShowURL Me.RowTag( Me.ListIndex ) End If End Sub #tag EndEvent #tag EndEvents \ No newline at end of file +#tag Window Begin Window wndSearch BackColor = &hFFFFFF Backdrop = "" CloseButton = True Composite = False Frame = 0 FullScreen = False HasBackColor = False Height = 600 ImplicitInstance= True LiveResize = False MacProcID = 0 MaxHeight = 32000 MaximizeButton = False MaxWidth = 32000 MenuBar = "" MenuBarVisible = True MinHeight = 64 MinimizeButton = True MinWidth = 64 Placement = 3 Resizeable = False Title = "Search [NAME]" Visible = True Width = 900 Begin ccSearch ccSearchBox AcceptFocus = "" AcceptTabs = True AutoDeactivate = True BackColor = 16777215 Backdrop = "" Enabled = True EraseBackground = True HasBackColor = False Height = 33 HelpTag = "" InitialParent = "" Left = 0 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = "" LockTop = True Scope = 0 TabIndex = 0 TabPanelIndex = 0 TabStop = True Top = 0 UseFocusRing = False Visible = True Width = 300 End Begin ccCancelSave CancelSave AcceptFocus = "" AcceptTabs = True AutoDeactivate = True BackColor = &hFFFFFF Backdrop = "" Enabled = True EraseBackground = True HasBackColor = False Height = 22 HelpTag = "" InitialParent = "" Left = 680 LockBottom = True LockedInPosition= False LockLeft = False LockRight = True LockTop = False Scope = 0 TabIndex = 1 TabPanelIndex = 0 TabStop = True Top = 558 UseFocusRing = "" Visible = True Width = 200 End Begin ListboxPRO lstResults AlternatingRows = True AutoDeactivate = True AutoHideScrollbars= True Bold = "" Border = True ColumnCount = 15 ColumnsResizable= "" ColumnWidths = "100%, 0" DataField = "" DataSource = "" DefaultRowHeight= 22 Enabled = True EnableDrag = "" EnableDragReorder= "" GridLinesHorizontal= 0 GridLinesVertical= 0 HasHeading = "" HeadingIndex = -1 Height = 513 HelpTag = "" Hierarchical = "" Index = -2147483648 InitialParent = "" InitialValue = "" Italic = "" Left = 0 LockBottom = True LockedInPosition= False LockLeft = True LockRight = "" LockTop = True RequiresSelection= False Scope = 0 ScrollbarHorizontal= "" ScrollBarVertical= True SelectionGradient= True SelectionType = 0 SourceList = False TabIndex = 2 TabPanelIndex = 0 TabStop = True TextFont = "System" TextSize = 12 TextUnit = 0 Top = 33 TypeToSearch = True Underline = "" UseFocusRing = False Visible = True Width = 300 _ScrollWidth = -1 End Begin MediaDetails cvsInfo AcceptFocus = "" AcceptTabs = "" AutoDeactivate = True Backdrop = "" DoubleBuffer = False Enabled = True EraseBackground = True Height = 546 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 300 LockBottom = True LockedInPosition= False LockLeft = True LockRight = True LockTop = True Scope = 0 TabIndex = 3 TabPanelIndex = 0 TabStop = True Top = 0 UseFocusRing = True Visible = True Width = 600 End Begin Thread ThrSearchMovieResult Height = 32 Index = -2147483648 Left = 934 LockedInPosition= False Priority = 5 Scope = 0 StackSize = 0 TabPanelIndex = 0 Top = 117 Width = 32 End Begin ProgressBar prgBar AutoDeactivate = True Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 312 LockBottom = True LockedInPosition= False LockLeft = True LockRight = "" LockTop = False Maximum = 0 Scope = 0 TabPanelIndex = 0 Top = 558 Value = 0 Visible = False Width = 356 End Begin PopupArrow popWeb AutoDeactivate = True Enabled = True Facing = 1 Height = 10 HelpTag = "" Index = -2147483648 InitialParent = "" Left = 639 LockBottom = True LockedInPosition= False LockLeft = False LockRight = True LockTop = False Scope = 0 TabIndex = 4 TabPanelIndex = 0 TabStop = True Top = 638 Visible = True Width = 10 End Begin Thread ThrSearchTVResult Height = 32 Index = -2147483648 Left = 978 LockedInPosition= False Priority = 5 Scope = 0 StackSize = 0 TabPanelIndex = 0 Top = 117 Width = 32 End Begin PopupMenu popLinks AutoDeactivate = True Bold = "" DataField = "" DataSource = "" Enabled = True Height = 20 HelpTag = "" Index = -2147483648 InitialParent = "" InitialValue = "#Menu.CMMSearchTheWeb" Italic = "" Left = 20 ListIndex = 0 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = "" LockTop = True Scope = 0 TabIndex = 5 TabPanelIndex = 0 TabStop = True TextFont = "System" TextSize = 0 TextUnit = 0 Top = 558 Underline = "" Visible = True Width = 150 End End #tag EndWindow #tag WindowCode #tag Event Sub Close() ThrSearchTVResult.Kill ThrSearchMovieResult.Kill 'Sckt.Close wndMain.lstTVShows.Enabled = True wndMain.lstMovies.Enabled = True End Sub #tag EndEvent #tag Event Sub Open() 'self.bottomBorderThickness = 54 wndMain.lstTVShows.Enabled = False wndMain.lstMovies.Enabled = False Select Case ActiveSection Case 0 Self.Title = wTitleSearchMovie Case 1 Self.Title = wTitleSearchShow Case 2 Self.Title = wTitleSearchAnime End Select End Sub #tag EndEvent #tag MenuHandler Function FileCloseWindow() As Boolean Handles FileCloseWindow.Action Close Return True End Function #tag EndMenuHandler #tag Property, Flags = &h1 Protected Lindex As Integer = -1 #tag EndProperty #tag Constant, Name = kSearchFieldHelpText, Type = String, Dynamic = True, Default = \"Title (year) or IMDb ID", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Title (year) or IMDb ID" #Tag Instance, Platform = Any, Language = nl, Definition = \"Titel (jaar) of IMDb ID" #Tag Instance, Platform = Any, Language = sv, Definition = \"Titel (\xC3\xA5r) eller IMDb ID" #Tag Instance, Platform = Any, Language = de, Definition = \"Titel (Jahr) oder IMDb ID" #Tag Instance, Platform = Any, Language = fr, Definition = \"Titre (Ann\xC3\xA9e) ou IMDB ID" #tag EndConstant #tag Constant, Name = kUseIMDBID, Type = String, Dynamic = True, Default = \"Instead of key words\x2C you can also use an IMDb ID to search for a movie.", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Instead of key words\x2C you can also use an IMDb ID to search for a movie." #Tag Instance, Platform = Any, Language = nl, Definition = \"In plaats van sleutelwoorden\x2C kunt u ook een IMDb ID gebruiken om te zoeken naar een film." #Tag Instance, Platform = Any, Language = sv, Definition = \"Inst\xC3\xA4llet f\xC3\xB6r nyckelord kan du anv\xC3\xA4nda IMDb ID f\xC3\xB6r att s\xC3\xB6ka efter en film." #Tag Instance, Platform = Any, Language = de, Definition = \"Anstelle von Suchbegriffen kann auch eine IMDb ID dazu genutzt werden um nach einem Film zu suchen." #Tag Instance, Platform = Any, Language = fr, Definition = \"Au lieu de mots cl\xC3\xA9s\x2C vous pouvez aussi utiliser l\'ID IMDB pour trouver un film." #tag EndConstant #tag Constant, Name = wTitleSearchAnime, Type = String, Dynamic = True, Default = \"Search Anime", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Search Anime" #Tag Instance, Platform = Any, Language = nl, Definition = \"Zoek Anime" #Tag Instance, Platform = Any, Language = de, Definition = \"Anime suchen" #Tag Instance, Platform = Any, Language = sv, Definition = \"S\xC3\xB6k tecknat" #Tag Instance, Platform = Any, Language = fr, Definition = \"Rechercher un anime" #tag EndConstant #tag Constant, Name = wTitleSearchMovie, Type = String, Dynamic = True, Default = \"Search Movies", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Search Movies" #Tag Instance, Platform = Any, Language = nl, Definition = \"Zoek Films" #Tag Instance, Platform = Any, Language = sv, Definition = \"S\xC3\xB6k filmer" #Tag Instance, Platform = Any, Language = de, Definition = \"Film suchen" #Tag Instance, Platform = Any, Language = fr, Definition = \"Rechercher un film" #tag EndConstant #tag Constant, Name = wTitleSearchShow, Type = String, Dynamic = True, Default = \"Search TV Shows", Scope = Protected #Tag Instance, Platform = Any, Language = en, Definition = \"Search Shows" #Tag Instance, Platform = Any, Language = nl, Definition = \"Zoek Series" #Tag Instance, Platform = Any, Language = de, Definition = \"Serie suchen" #Tag Instance, Platform = Any, Language = sv, Definition = \"S\xC3\xB6k TV-serier" #Tag Instance, Platform = Any, Language = fr, Definition = \"Rechercher une S\xC3\xA9rie TV" #tag EndConstant #tag EndWindowCode #tag Events ccSearchBox #tag Event Function KeyDown(Key As String) As Boolean If Asc(Key) = 13 Then Return True End Function #tag EndEvent #tag Event Sub Open() If ActiveSection <= 1 Then Me.edtSearch.CueText = kSearchFieldHelpText Me.edtSearch.HelpTag = kUseIMDBID End If End Sub #tag EndEvent #tag Event Sub ResetSearch() Me.edtSearch.Text = "" End Sub #tag EndEvent #tag Event Sub DoSearch(SearchText as String) If Trim(SearchText) = "" Then Return Dim ID as String = Trim( match( "[0-9]*", SearchText ) ) If ID.Len >= 5 Then Self.Close dlgProgress.SpecialInit( ID, lstResults.Cell( lstResults.ListIndex, 0 ) ) ElseIf SearchText.Left(2) = "tt" OR SearchText.Left(3) = "id:" Then Self.Close dlgProgress.SpecialInit( Trim( SearchText.ReplaceAll("id:","") ), lstResults.Cell( lstResults.ListIndex, 0 ) ) Else If ActiveSection = 0 Then dlgProgress.Start( Loc.kSearching + ":", SearchText, 0, "ManualSearchMovie" ) If ActiveSection = 1 Then dlgProgress.Start( Loc.kSearching + ":", SearchText, 0, "ManualSearchTVShow" ) End If End Sub #tag EndEvent #tag EndEvents #tag Events CancelSave #tag Event Sub ActionCancel() dlgProgress.Close Close End Sub #tag EndEvent #tag Event Sub ActionOK() Dim ID as String = lstResults.Cell( lstResults.ListIndex, 2 ) If ID = "" Then ID = lstResults.Cell( lstResults.ListIndex, 1 ) Dim Name as String = lstResults.Cell( lstResults.ListIndex, 0 ) dlgProgress.Close Dim FolderParent as FolderItem If ActiveSection = 0 Then FolderParent = MovieAttr.FolderParent If ActiveSection = 1 Then FolderParent = TVAttr.FolderParent Self.Close If PriorArtFound( FolderParent ) Then If Prefs.integerForKey("KeepImages") = 0 Then // Ask First Dim i as Integer = MsgDlg( Nil, 1, MovieCore.msgPriorMovieArtFound.ReplaceAll( "<movie>", CurrentItemName ), MovieCore.msgPriorArtDeletion, MovieCore.btnReplaceExistingArtwork, Loc.dlgCancel, MovieCore.btnDownloadMissingArtwork ) If i = 1 Then PriorArtDelete( FolderParent ) If i = 2 Then Return ElseIf Prefs.integerForKey("KeepImages") = 1 Then // Always PriorArtDelete( FolderParent ) End If End If dlgProgress.SpecialInit( ID, Name ) 'If ActiveSection = 0 Then dlgProgress.SpecialInit( ID, Name ) 'If ActiveSection = 1 Then dlgProgress.SpecialInit( ID, Name ) End Sub #tag EndEvent #tag Event Sub Open() me.btnRight.Default = False End Sub #tag EndEvent #tag EndEvents #tag Events lstResults #tag Event Sub DoubleClick() If Me.ListIndex > -1 Then CancelSave.btnRight.Push End Sub #tag EndEvent #tag Event Function KeyDown(Key As String) As Boolean If Keyboard.AsyncKeyDown( &h4C ) or Keyboard.AsyncKeyDown( &h24 ) then // Pressed Enter If Me.ListIndex > -1 then CancelSave.btnRight.Push ElseIf Keyboard.AsyncKeyDown( &h35 ) then // Pressed Escape CancelSave.btnLeft.Push End If End Function #tag EndEvent #tag Event Sub Change() CancelSave.btnRight.Enabled = ( Me.ListIndex > -1 ) If Me.ListIndex = Lindex Then Return ThrSearchMovieResult.Kill ThrSearchTVResult.Kill If ActiveSection = 0 Then ThrSearchMovieResult.Run If ActiveSection = 1 Then ThrSearchTVResult.Run Lindex = Me.ListIndex End Sub #tag EndEvent #tag EndEvents #tag Events cvsInfo #tag Event Sub Paint(g As Graphics, areas() As REALbasic.Rect) If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = &c000000 g.FillRect 0, 0, me.Width, me.Height // ## Backdrop If lstResults.ListIndex < 0 Then Me.DrawBackdrop( g, Nil ) // #### Return if there's nothing selected If lstResults.ListIndex < 0 Then Return // ## Backdrop Me.DrawBackdrop( g, lstResults.CellTag( lstResults.ListIndex, 6 ) ) // ## Poster Me.DrawPoster( g, lstResults.CellTag( lstResults.ListIndex, 5 ) ) // ## Write Dim TextTop as Integer = 13 Dim TextLeft as Integer = 20 If lstResults.CellTag( lstResults.ListIndex, 5 ) <> Nil Then TextLeft = 184 // -- Title g.TextSize = 16 g.Bold = True TextTop = TextTop + g.TextSize Dim Title as String = lstResults.Cell( lstResults.ListIndex, 3 ) Dim DateYear as Integer = Val( lstResults.Cell( lstResults.ListIndex, 4 ).Left(4) ) If DateYear < 1000 Then DateYear = Val( lstResults.Cell( lstResults.ListIndex, 4 ).Right(4) ) Dim DisplayTitle as String = Title If DateYear > 1000 And ActiveSection = 0 Then DisplayTitle = Title + " (" + Str( DateYear ) + ")" If Title <> "" Then If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString DisplayTitle, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c333333 Else g.ForeColor = RGBa( 100, 100, 100, .8 ) g.DrawString DisplayTitle, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + g.StringHeight( DisplayTitle, Me.Width - TextLeft - 20 ) - 2 End If // -- Original Title Dim OriginalTitle as String = lstResults.Cell( lstResults.ListIndex, 13 ) If OriginalTitle <> "" And lstResults.Cell( lstResults.ListIndex, 3 ) <> OriginalTitle Then g.TextSize = 14 If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString OriginalTitle, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c666666 Else g.ForeColor = RGBa( 100, 100, 100, .6 ) g.DrawString OriginalTitle, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + g.StringHeight( OriginalTitle, Me.Width - TextLeft - 20 ) End If // -- Tagline g.Bold = False g.TextSize = 12 g.Italic = True Dim Tagline as String = lstResults.Cell( lstResults.ListIndex, 8 ) If Tagline <> "" Then If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString Tagline, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c33333340 Else g.ForeColor = RGBa( 80, 80, 80, .75 ) g.DrawString Tagline, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + 4 + g.StringHeight( Tagline, Me.Width - TextLeft - 20 ) End If // -- Duration - Genre(s) - Premiere Dim SubTagLine as String g.Italic = False Dim Duration as String = lstResults.Cell( lstResults.ListIndex, 10 ) Dim Genres as String = lstResults.Cell( lstResults.ListIndex, 11 ) Dim Premiere as String = lstResults.Cell( lstResults.ListIndex, 4 ) // Duration If Val( Duration ) > 0 Then If Val( Duration ) > 60 Then SubTagLine = PrettyTime( Val( Duration ) ) Else SubTagLine = Duration + Trim( loc.kMinutesShort ).Left(1) End If End If If SubTagLine <> "" And Genres <> "" Then SubTagLine = SubTagLine + " - " If Genres <> "" Then SubTagLine = SubTagLine + Genres If SubTagLine <> "" And Premiere <> "" Then SubTagLine = SubTagLine + " - " If Premiere <> "" And Premiere <> "False" Then SubTagLine = SubTagLine + PrettyDate( Premiere ) // -- Write SubTagLine If SubTagLine <> "" Then If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString SubTagLine, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c555555 Else g.ForeColor = RGBa( 100, 100, 100, .67 ) g.DrawString SubTagLine, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + g.StringHeight( SubTagLine, Me.Width - TextLeft - 20 ) + g.TextSize End If // ## Write Plot Dim Plot as String = lstResults.Cell( lstResults.Listindex, 9 ) If Plot <> "" Then If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString Plot, TextLeft, TextTop + 1, Me.Width - TextLeft - 20, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c333333 Else g.ForeColor = RGBa( 100, 100, 100, .8 ) g.DrawString Plot, TextLeft, TextTop, Me.Width - TextLeft - 20, False TextTop = TextTop + g.StringHeight( Plot, Me.Width - TextLeft - 20 ) + 12 End If // ## Write Path Dim path as String If ActiveSection = 0 Then path = MovieAttr.FolderParent.ShellPath.ReplaceAll("\","") If ActiveSection = 1 Then path = TVAttr.FolderParent.ShellPath.ReplaceAll("\","") TextTop = Me.Height - g.StringHeight( path, Me.Width - 40 ) If lstResults.CellTag( lstResults.ListIndex, 7 ) <> Nil Then TextTop = TextTop - 100 If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &cFFFFFF Else g.ForeColor = RGBa( 100, 100, 100, .2 ) g.DrawString path, 20, TextTop, Me.Width - 40, False If NOT Prefs.boolForKey("DarkUI") Then g.ForeColor = &c666666 Else g.ForeColor = RGBa( 100, 100, 100, .6 ) g.DrawString path, 20, TextTop, Me.Width - 40, False Me.DrawBanner( g, lstResults.CellTag( lstResults.ListIndex, 7 ) ) // ## Borders g.ForeColor = &cC3C3C3 g.DrawLine 0, 0, me.Width, 0 g.DrawLine 0, me.Height - 1, me.Width, me.Height - 1 End Sub #tag EndEvent #tag EndEvents #tag Events ThrSearchMovieResult #tag Event Sub Run() prgBar.Visible = False cvsInfo.Reload If lstResults.ListIndex = -1 Then Return Dim Lang as String = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) Dim ID as String = lstResults.Cell( lstResults.ListIndex, 1 ) // IMDB ID If ID = "" Then ID = lstResults.Cell( lstResults.ListIndex, 2 ) // TMDB ID If ID = "" Then Return // ## If no previous data has been fetched If lstResults.CellTag( lstResults.ListIndex, 5 ) <> Nil And lstResults.CellTag( lstResults.ListIndex, 6 ) <> Nil Then Return Dim Sckt as New MovieSckt Sckt.Yield = True prgBar.Visible = True prgBar.Maximum = 6 prgBar.Value = 0 prgBar.Value = prgBar.Value + 1 // ## Local Info JSON Dim JSONString as String = DefineEncoding( Sckt.Get( Sckt.URL("MovieInfo", lstResults.Cell( lstResults.ListIndex, 1 ), Prefs.stringForKey("DBLanguage") ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) Sckt.Close 'JSONString = DecodingFromHTMLMBS( JSONString ) Dim TMDBLocal as New JSONItem If JSONString.ValidJSON("TMDb Local") Then TMDBLocal.Load JSONString JSONString = "" prgBar.Value = prgBar.Value + 1 // ## US Info JSON Dim TMDBUS as New JSONItem If NOT TMDBLocal.HasName("status_message") And Lang.instr( 0, "en" ) = 0 Then JSONString = DefineEncoding( Sckt.Get( Sckt.URL("MovieInfo", lstResults.Cell( lstResults.ListIndex, 1 ), "en" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) If JSONString.ValidJSON("TMDb US") Then TMDBUS.load JSONString JSONString = "" End If prgBar.Value = prgBar.Value + 1 // ## IMDb Info JSON Dim IMDb as New JSONItem If ID.Left(2) = "tt" And NOT TMDBLocal.HasName("imdb_id") Then IMDb = GetIMDbJSON( ID, True ) 'JSONString = DefineEncoding( IMDBjson( ID, True ), Encodings.UTF8 ) 'If JSONString.ValidJSON( "IMDb" ) Then IMDB.Load JSONString elseif id.Left(2) <> "tt" and TMDBLocal.HasName("imdb_id") then ID = TMDBLocal.Value("imdb_id") IMDb = GetIMDbJSON(ID, True ) End If // :0 Display Title / :1 IMDb / :2 Database ID / :3 Original Title / :4 ReleaseDate / :5 PosterURL / :6 FanartURL / :7 BannerURL // :0 Display Title // :1 IMDb ID If lstResults.Cell( lstResults.ListIndex, 1 ) = "" And TMDBLocal.HasName("imdb_id") And TMDBLocal.Value("imdb_id") <> "" Then lstResults.Cell( lstResults.ListIndex, 1 ) = TMDBLocal.Value("imdb_id") End If // :2 TMDb ID If lstResults.Cell( lstResults.ListIndex, 2 ) = "" And TMDBLocal.HasName("id") And TMDBLocal.Value("id") <> "" Then lstResults.Cell( lstResults.ListIndex, 2 ) = TMDBLocal.Value("id") End If // :3 Title Dim DisplayName as String If TMDBUS.HasName("title") And TMDBUS.Value("title") <> "" Then DisplayName = TMDBUS.Value("title") If IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then DisplayName = IMDb.Value("TITLE") If TMDBLocal.HasName("title") And TMDBLocal.Value("title") <> "" Then DisplayName = TMDBLocal.Value("title") lstResults.Cell( lstResults.ListIndex, 3 ) = ReplaceAll( DisplayName, "&", "&" ) // :4 Release Date If IMDb.HasName("RELEASE_DATE") And IMDb.Value("RELEASE_DATE") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = IMDb.Value("RELEASE_DATE") If TMDBUS.HasName("release_date") And TMDBUS.Value("release_date") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = TMDBUS.Value("release_date") If TMDBLocal.HasName("release_date") And TMDBLocal.Value("release_date") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = TMDBLocal.Value("release_date") // 5: PosterURL Dim PosterURL as String = lstResults.Cell( lstResults.ListIndex, 5 ) // 6: FanartURL Dim FanartURL as String = lstResults.Cell( lstResults.ListIndex, 6 ) // 7: BannerURL Dim BannerURL as String = lstResults.Cell( lstResults.ListIndex, 7 ) // 8: Tagline If TMDBUS.HasName("tagline") And TMDBUS.value("tagline") <> "" Then lstResults.Cell( lstResults.ListIndex, 8 ) = TMDBUS.Value("tagline") // U.S. Backup If IMDb.HasName("TAGLINE") And IMDb.Value("TAGLINE") <> "" Then lstResults.Cell( lstResults.ListIndex, 8 ) = IMDb.Value("TAGLINE") If TMDBLocal.HasName("tagline") And TMDBLocal.Value("tagline") <> "" Then lstResults.Cell( lstResults.ListIndex, 8 ) = TMDBLocal.Value("tagline") // Local // 9: Plot If TMDBUS.HasName("overview") And TMDBUS.Value("overview") <> "" Then lstResults.Cell( lstResults.ListIndex, 9 ) = DecodeHTML( TMDBUS.Value("overview") ) // U.S. Backup If IMDb.HasName("STORYLINE") And IMDb.Value("STORYLINE") <> "" Then lstResults.Cell( lstResults.ListIndex, 9 ) = DecodeHTML( IMDb.Value("STORYLINE") ) If TMDBLocal.HasName("overview") And TMDBLocal.Value("overview") <> "" Then lstResults.Cell( lstResults.ListIndex, 9 ) = DecodeHTML( TMDBLocal.Value("overview") ) // Local // 10: Runtime If TMDBUS.HasName("runtime") And TMDBUS.Value("runtime") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = TMDBUS.Value("runtime") If TMDBLocal.HasName("runtime") And TMDBLocal.Value("runtime") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = TMDBLocal.Value("runtime") // 11: Genres If TMDBLocal.HasName("genres") And TMDBLocal.Child("genres").Count > 0 Then Dim genres as String For i as Integer = 0 To TMDBLocal.Child("genres").Count - 1 If i = 3 Then Exit If genres = "" Then genres = TMDBLocal.Child("genres").Child(i).Value("name") Else genres = genres + " | " + TMDBLocal.Child("genres").Child(i).Value("name") End If Next lstResults.Cell( lstResults.ListIndex, 11 ) = genres End If // 12: Rating If TMDBUS.HasName("vote_average") And TMDBUS.Value("vote_average") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = Str( Round( TMDBUS.Value("vote_average") * 10 ) / 10 ) If IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = Str( IMDb.Value("RATING") ) // 13: Original Title Dim OriginalTitle as String If TMDBLocal.HasName("original_title") And TMDBLocal.Value("original_title") <> "" Then OriginalTitle = TMDBLocal.Value("original_title") If IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then OriginalTitle = IMDb.Value("TITLE") If IMDb.HasName("ORIGINAL_TITLE") And IMDb.Value("ORIGINAL_TITLE") <> "" Then OriginalTitle = IMDb.Value("ORIGINAL_TITLE") If TMDBUS.HasName("title") And TMDBUS.Value("title") <> "" Then OriginalTitle = TMDBUS.Value("title") lstResults.Cell( lstResults.ListIndex, 13 ) = OriginalTitle // 14: MPAA Rating If IMDb.HasName("MPAA_RATING") And IMDb.Value("MPAA_RATING") = "" Then lstResults.Cell( lstResults.ListIndex, 14 ) = IMDb.Value("MPAA_RATING") // 15: = Homepage If TMDBUS.HasName("homepage") And TMDBUS.Value("homepage") <> "" Then lstResults.Cell( lstResults.ListIndex, 15 ) = TMDBUS.Value("homepage") If TMDBLocal.HasName("homepage") And TMDBLocal.Value("homepage") <> "" Then lstResults.Cell( lstResults.ListIndex, 15 ) = TMDBLocal.Value("homepage") // Get Poster IMG prgBar.Value = prgBar.Value + 1 If PosterURL <> "" And PosterURL.Left(4) = "http" Then lstResults.CellTag( lstResults.ListIndex, 5 ) = Picture.FromData( CURLGet( PosterURL ) ) ', Prefs.IntegerForKey("TimeOut") ) ) End If // Get Backdrop IMG prgBar.Value = prgBar.Value + 1 If FanartURL <> "" And FanartURL.Left(4) = "http" Then lstResults.CellTag( lstResults.ListIndex, 6 ) = Picture.FromData( CURLGet( FanartURL ) ) ', Prefs.integerForKey("TimeOut") ) ) End If // Get Banner IMG prgBar.Value = prgBar.Value + 1 If BannerURL <> "" And BannerURL.Left(4) = "http" Then lstResults.CellTag( lstResults.ListIndex, 7 ) = Picture.FromData( CURLGet( BannerURL ) ) ', Prefs.integerForKey("TimeOut") ) ) End If Sckt.Close cvsInfo.Reload prgBar.Visible = False End Sub #tag EndEvent #tag EndEvents #tag Events popWeb #tag Event Function MouseDown(X As Integer, Y As Integer) As Boolean If X > 0 And Y > 0 And _ X < Me.Width And Y < Me.Width Then Return True End If End Function #tag EndEvent #tag Event Sub MouseUp(X As Integer, Y As Integer) If X < 0 And Y < 0 And _ X > Me.Width And Y > Me.Width Then Return If lstResults.ListIndex = -1 Then Return Dim imdbID as String = lstResults.Cell( lstResults.ListIndex, 1 ) Dim tmdbID as String = lstResults.Cell( lstResults.ListIndex, 2 ) Dim Title as String = lstResults.Cell( lstResults.ListIndex, 3 ) Dim TitleOriginal as String = lstResults.Cell( lstResults.ListIndex, 13 ) Dim ReleaseDate as String = lstResults.Cell( lstResults.ListIndex, 4 ) Dim HomePageURL as String = lstResults.Cell( lstResults.ListIndex, 15 ) PopUpWebMenu imdbID, tmdbID, Title, TitleOriginal, ReleaseDate, HomePageURL End Sub #tag EndEvent #tag EndEvents #tag Events ThrSearchTVResult #tag Event Sub Run() prgBar.Visible = False cvsInfo.Reload If lstResults.ListIndex = -1 Then Return Dim Lang as String = Prefs.stringForKey("DBLanguage").NthField( "-", 1 ) Dim ID as String = lstResults.Cell( lstResults.ListIndex, 2 ) // TVDB ID If ID = "" Then ID = lstResults.Cell( lstResults.ListIndex, 1 ) // IMDb ID If ID = "" Then Return // ## If no previous data has been fetched If lstResults.CellTag( lstResults.ListIndex, 5 ) <> Nil And lstResults.CellTag( lstResults.ListIndex, 6 ) <> Nil Then Return Dim sckt as New TVDBSckt sckt.Yield = True Dim JSONString as String prgBar.Visible = True prgBar.Maximum = 8 prgBar.Value = 0 prgBar.Value = prgBar.Value + 1 // ## If IMDb ID If ID.Left(2) = "tt" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "InfoAlias", ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'JSONString = DecodingFromHTMLMBS( JSONString ) 'JSONString = JSONString.XML2JSON Dim TVDBAlias as New JSONItem 'If JSONString.ValidJSON("TVDB Alias") Then TVDBAlias.Load JSONString TVDBAlias = JSONString.XML2JSON If TVDBAlias <> Nil And TVDBAlias.HasName("Data") And TVDBAlias.ToString.InStr( 0, "Series" ) <> 0 And TVDBAlias.Child("Data").HasName("Series") And TVDBAlias.Child("Data").Child("Series").HasName("id") Then ID = TVDBAlias.Child("Data").Child("Series").Value("id") JSONString = "" End If prgBar.Value = prgBar.Value + 1 // ## Local Info JSON If ID.Left(2) <> "tt" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'JSONString = DecodingFromHTMLMBS( JSONString ) 'JSONString = JSONString.XML2JSON End If Dim TVDBLocal as New JSONItem 'If JSONString.ValidJSON("TVDB Local", True) Then TVDBLocal.Load JSONString TVDBLocal = JSONString.XML2JSON If TVDBLocal <> Nil And TVDBLocal.HasName("Data") And TVDBLocal.Child("Data").HasName("Series") Then TVDBLocal.Load TVDBLocal.Child("Data").Child("Series").ToString JSONString = "" prgBar.Value = prgBar.Value + 1 // ## US Info JSON If ID.Left(2) <> "tt" And Lang <> "en" Then JSONString = DefineEncoding( sckt.Get( TVCore.URL( "InfoShort", ID, "en" ), Prefs.integerForKey("TimeOut") ), Encodings.UTF8 ) sckt.Close 'JSONString = DecodingFromHTMLMBS( JSONString ) 'JSONString = JSONString.XML2JSON End If Dim TVDBUS as New JSONItem If Lang <> "en" Then 'If JSONString.ValidJSON("TVDB US") Then TVDBUS.Load JSONString TVDBUS = JSONString.XML2JSON If TVDBUS.HasName("Data") And TVDBUS.Child("Data").HasName("Series") Then TVDBUS.Load TVDBUS.Child("Data").Child("Series").ToString JSONString = "" End If prgBar.Value = prgBar.Value + 1 // ## IMDb JSON Dim IMDb as New JSONItem If ID.Left(2) = "tt" And ( TVDBLocal <> Nil And TVDBLocal.HasName("Data") And TVDBLocal.Value("Data") = "" ) Then IMDb = GetIMDbJSON( ID, True ) 'JSONString = IMDBjson( ID, True ) 'If JSONString.ValidJSON("IMDb") Then IMDb.Load JSONString 'JSONString = "" elseif ID.Left(2) <> "tt" and TVDBLocal <> Nil and TVDBLocal.HasName("IMDB_ID") then ID = TVDBLocal.Value("IMDB_ID") IMDb = GetIMDbJSON( ID, True ) End If prgBar.Value = prgBar.Value + 1 // ## Set cells // :0 Display Title // :1 IMDb ID If lstResults.Cell( lstResults.ListIndex, 1 ) = "" And TVDBLocal <> Nil And TVDBLocal.HasName("IMDB_ID") And TVDBLocal.Value("IMDB_ID") <> "" Then lstResults.Cell( lstResults.ListIndex, 1 ) = TVDBLocal.Value("IMDB_ID") // :2 TVDB ID If IMDb <> Nil And IMDb.HasName("TITLE_ID") And IMDb.Value("TITLE_ID") <> "" Then lstResults.Cell( lstResults.ListIndex, 2 ) = IMDb.Value("TITLE_ID") If TVDBLocal <> Nil And TVDBLocal.HasName("id") And TVDBLocal.Value("id") <> "" Then lstResults.Cell( lstResults.ListIndex, 2 ) = TVDBLocal.Value("id") // :3 Title If imdb <> Nil And IMDb.HasName("TITLE") And IMDb.Value("TITLE") <> "" Then lstResults.Cell( lstResults.ListIndex, 3 ) = IMDb.Value("TITLE") If TVDBUS <> Nil And TVDBUS.HasName("SeriesName") And TVDBUS.Value("SeriesName") <> "" Then lstResults.Cell( lstResults.ListIndex, 3 ) = TVDBUS.Value("SeriesName") If TVDBLocal <> Nil And TVDBLocal.HasName("SeriesName") And TVDBLocal.Value("SeriesName") <> "" Then lstResults.Cell( lstResults.ListIndex, 3 ) = TVDBLocal.Value("SeriesName") lstResults.Cell( lstResults.ListIndex, 3 ) = ReplaceAll( lstResults.Cell( lstResults.ListIndex, 3 ), "&", "&" ) // :4 Release Date If IMDb <> Nil And IMDb.HasName("RELEASE_DATE") And IMDb.Value("RELEASE_DATE") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = IMDb.Value("RELEASE_DATE") If TVDBUS <> Nil And TVDBUS.HasName("FirstAired") And TVDBUS.Value("FirstAired") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = TVDBUS.Value("FirstAired") If TVDBLocal <> Nil And TVDBLocal.HasName("FirstAired") And TVDBLocal.Value("FirstAired") <> "" Then lstResults.Cell( lstResults.ListIndex, 4 ) = TVDBLocal.Value("FirstAired") // :5 Poster URL Dim PosterURL as String = lstResults.Cell( lstResults.ListIndex, 5 ) If IMDb <> Nil And IMDb.HasName("POSTER") And IMDb.Value("POSTER") <> "" Then PosterURL = IMDb.Value("POSTER") If TVDBUS <> Nil And TVDBUS.HasName("poster") And TVDBUS.Value("poster") <> "" Then PosterURL = TVDBUS.Value("poster") If TVDBLocal <> Nil And TVDBLocal.HasName("poster") And TVDBLocal.Value("poster") <> "" Then PosterURL = TVDBLocal.Value("poster") If PosterURL.Left(4) <> "http" then PosterURL = "https://www.thetvdb.com/banners/_cache/" + PosterURL lstResults.Cell( lstResults.ListIndex, 5 ) = PosterURL // :6 Fanart URL Dim FanartURL as String = lstResults.Cell( lstResults.ListIndex, 6 ) If IMDb <> Nil And IMDb.HasName("MEDIA_IMAGES") And IMDb.Child("MEDIA_IMAGES").Count > 1 Then FanartURL = IMDb.Child("MEDIA_IMAGES").Value(0) If TVDBUS <> Nil And TVDBUS.HasName("fanart") And TVDBUS.Value("fanart") <> "" Then FanartURL = TVDBUS.Value("fanart") If TVDBLocal <> Nil And TVDBLocal.HasName("fanart") And TVDBLocal.Value("fanart") <> "" Then FanartURL = TVDBLocal.Value("fanart") If FanartURL.Left(4) <> "http" Then FanartURL = "https://www.thetvdb.com/banners/_cache/" + FanartURL lstResults.Cell( lstResults.ListIndex, 6 ) = FanartURL // :7 Banner URL Dim BannerURL as String = lstResults.Cell( lstResults.ListIndex, 7 ) If TVDBUS <> Nil And TVDBUS.HasName("banner") And TVDBUS.Value("banner") <> "" Then BannerURL = TVDBUS.Value("banner") If TVDBLocal <> Nil And TVDBLocal.HasName("banner") And TVDBLocal.Value("banner") <> "" Then BannerURL = TVDBLocal.Value("banner") If BannerURL.Left(4) <> "http" Then BannerURL = "https://www.thetvdb.com/banners/" + BannerURL lstResults.Cell( lstResults.ListIndex, 7 ) = BannerURL // :8 Tagline Dim Tagline as String '= lstResults.Cell( lstResults.ListIndex, 8 ) If TVDBUS <> Nil And TVDBUS.HasName("Network") And TVDBUS.Value("Network") <> "" Then Tagline = TVDBUS.Value("Network") If TVDBLocal <> Nil And TVDBLocal.HasName("Network") And TVDBLocal.Value("Network") <> "" Then Tagline = TVDBLocal.Value("Network") If IMDb <> Nil And IMDb.HasName("TAGLINE") And IMDb.Value("TAGLINE") <> "" Then Tagline = IMDb.Value("TAGLINE") If TVDBLocal <> Nil And TVDBLocal.HasName("Status") And TVDBLocal.Value("Status") <> "" Then Tagline = Tagline + " | " + TVDBLocal.Value("Status") lstResults.Cell( lstResults.ListIndex, 8 ) = Tagline // :9 Plot dim plot as String If plot = "" and IMDb <> Nil And IMDb.HasName("STORYLINE") And IMDb.Value("STORYLINE") <> "" Then plot = IMDb.Value("STORYLINE") If plot = "" and TVDBUS <> Nil And TVDBUS.HasName("Overview") And TVDBUS.Value("Overview") <> "" Then plot = TVDBUS.Value("Overview") If plot = "" and TVDBLocal <> Nil And TVDBLocal.HasName("Overview") And TVDBLocal.Value("Overview") <> "" Then plot = TVDBLocal.Value("Overview") lstResults.Cell( lstResults.ListIndex, 9 ) = DecodeHTML( plot ) // :10 Runtime If IMDb <> Nil And IMDb.HasName("RUNTIME") And IMDb.Value("RUNTIME") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = IMDb.Value("RUNTIME") If TVDBUS <> Nil And TVDBUS.HasName("Runtime") And TVDBUS.Value("Runtime") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = TVDBUS.Value("Runtime") If TVDBLocal <> Nil And TVDBLocal.HasName("Runtime") And TVDBLocal.Value("Runtime") <> "" Then lstResults.Cell( lstResults.ListIndex, 10 ) = TVDBLocal.Value("Runtime") // :11 Genres Dim Genres as String If TVDBUS <> Nil And TVDBUS.HasName("Genre") And TVDBUS.Value("Genre") <> "" Then Genres = TVDBUS.Value("Genre") If TVDBLocal <> Nil And TVDBLocal.HasName("Genre") And TVDBLocal.Value("Genre") <> "" Then Genres = TVDBLocal.Value("Genre") Genres = Trim( Genres.ReplaceAll("|", " | ").ReplaceAll(" and ", " & " ) ) Genres = Genres.Left( Genres.Len - 2 ) Genres = Genres.Right( Genres.Len - 2 ) lstResults.Cell( lstResults.ListIndex, 11 ) = Genres // :12 Rating If IMDb <> Nil And IMDb.HasName("RATING") And IMDb.Value("RATING") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = IMDb.Value("RATING") If TVDBUS <> Nil And TVDBUS.HasName("Rating") And TVDBUS.Value("Rating") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = TVDBUS.Value("Rating") If TVDBLocal <> Nil And TVDBLocal.HasName("Rating") And TVDBLocal.Value("Rating") <> "" Then lstResults.Cell( lstResults.ListIndex, 12 ) = TVDBLocal.Value("Rating") // :13 Original Title If IMDb <> Nil And IMDb.HasName("ORIGINAL_TITLE") And IMDb.Value("ORIGINAL_TITLE") <> "" Then lstResults.Cell( lstResults.ListIndex, 13 ) = IMDb.Value("ORIGINAL_TITLE") // 14: MPAA Rating If TVDBUS <> Nil And TVDBUS.HasName("ContentRating") And TVDBUS.Value("ContentRating") <> "" Then lstResults.Cell( lstResults.ListIndex, 14 ) = TVDBUS.Value("ContentRating") If IMDb <> Nil And IMDb.HasName("MPAA_RATING") And IMDb.Value("MPAA_RATING") = "" Then lstResults.Cell( lstResults.ListIndex, 14 ) = IMDb.Value("MPAA_RATING") If TVDBLocal <> Nil And TVDBLocal.HasName("ContentRating") And TVDBLocal.Value("ContentRating") <> "" Then lstResults.Cell( lstResults.ListIndex, 14 ) = TVDBLocal.Value("ContentRating") cvsInfo.Reload // Get Banner IMG prgBar.Value = prgBar.Value + 1 If BannerURL <> "" And BannerURL.Left(4) = "http" Then lstResults.CellTag( lstResults.ListIndex, 7 ) = Picture.FromData( CURLGet( BannerURL ) ) ', Prefs.integerForKey("TimeOut") ) ) End If cvsInfo.Reload // Get Poster IMG prgBar.Value = prgBar.Value + 1 If PosterURL <> "" And PosterURL.Left(4) = "http" Then 'If ActiveSection = 0 Then lstResults.CellTag( lstResults.ListIndex, 5 ) = Picture.FromData( CURLGet( PosterURL ) ) ', Prefs.IntegerForKey("TimeOut") ) ) End If cvsInfo.Reload // Get Backdrop IMG prgBar.Value = prgBar.Value + 1 If FanartURL <> "" And FanartURL.Left(4) = "http" Then 'If ActiveSection = 0 Then lstResults.CellTag( lstResults.ListIndex, 6 ) = Picture.FromData( CURLGet( FanartURL ) ) ', Prefs.integerForKey("TimeOut") ) ) End If sckt.Close cvsInfo.Reload prgBar.Visible = False End Sub #tag EndEvent #tag EndEvents #tag Events popLinks #tag Event Sub Open() Me.PullsDown = True 'Me.BezelStyle = PopupMenuExtension.NSBezelStyle.NSTexturedRoundedBezelStyle End Sub #tag EndEvent #tag Event Function MouseDown(X As Integer, Y As Integer) As Boolean Me.DeleteAllRows Me.AddRow Menu.CMMSearchTheWeb Dim HomePageURL, IMDbID, DBID, SearchTitle as String IMDbID = lstResults.Cell( lstResults.ListIndex, 1 ) DBID = lstResults.Cell( lstResults.ListIndex, 2 ) SearchTitle = lstResults.Cell( lstResults.ListIndex, 3 ) If SearchTitle = "" Then SearchTitle = lstResults.Cell( lstResults.ListIndex, 13 ) SearchTitle = EncodingToURLMBS( SearchTitle ) // Homepage If HomePageURL <> "" Then Me.AddNewRow "Homepage", HomePageURL Me.AddRow "-" End If // IMDB ID If IMDbID.Left(2) = "tt" Then Me.AddNewRow "IMDb", "http://www.imdb.com/title/" + IMDbID, ScaleImage( icoimdb, 16, 16 ) // Database ID If DBID <> "" And DBID.Left(2) <> "tt" And ActiveSection = 0 Then Me.AddNewRow "TMDb", "http://www.themoviedb.org/movie/" + DBID, ScaleImage( icotmdb, 16, 16 ) ElseIf DBID <> "" And DBID.Left(2) <> "tt" And ActiveSection = 1 Then Me.AddNewRow "TVDB", "http://thetvdb.com/?tab=series&id=" + DBID, ScaleImage( icotvdb, 16, 16 ) End If // Search If SearchTitle <> "" Then Me.AddNewRow "Wikipedia", "http://en.wikipedia.org/wiki/Special:Search?search=" + SearchTitle, ScaleImage( icowikipedia, 16, 16 ) If ActiveSection = 0 Then Me.AddNewRow "RottenTomatoes", "http://www.rottentomatoes.com/search/?search=" + SearchTitle, ScaleImage( icorottentomatoes, 16, 16 ) Me.AddNewRow "YouTube", "http://www.youtube.com/results?search_query=" + SearchTitle, ScaleImage( icoyoutube, 16, 16 ) Me.AddNewRow "Netflix", "http://www.netflix.com/Search?v1=" + SearchTitle, ScaleImage( iconetflix, 16, 16 ) End If End If // Torrentz If Keyboard.AsyncAltKey And SearchTitle <> "" Then Me.AddRow "-" Me.AddNewRow "The PirateBay", "http://pirateproxy.net/search/" + SearchTitle, ScaleImage( icotpb, 16, 16 ) Me.AddNewRow "Torrentz", "http://torrentz.eu/search?q=" + SearchTitle, ScaleImage( icotorrentz, 16, 16 ) Me.AddNewRow "KickAssTorrents", "http://kickass.to/usearch/" + SearchTitle, ScaleImage( icokat, 16, 16 ) If ActiveSection = 0 Then Me.AddNewRow "Movies.io", "http://movies.io/m/search?utf8=✓&q=" + SearchTitle, ScaleImage( icomoviesio, 16, 16 ) Me.AddNewRow "YIFY Torrents", "http://yify-torrents.com/browse-movie/" + SearchTitle, ScaleImage( icoyify, 16, 16 ) End If End If // Buy Legally If SearchTitle <> "" Then Me.AddRow "-" Me.AddNewRow "eBay", "http://shop.ebay.com/?_from=R40&_trksid=p5197.m570.l1313&_nkw=" + SearchTitle + "&_sacat=See-All-Categories", ScaleImage( icoebay, 16, 16 ) Me.AddNewRow "Amazon.com", "http://www.amazon.com/s/vime03-20/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=" + SearchTitle + "&x=0&y=0", ScaleImage( icoamazon, 16, 16 ) Me.AddNewRow "Amazon.co.uk", "http://www.amazon.co.uk/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=" + SearchTitle + "&x=0&y=0", ScaleImage( icoamazon, 16, 16 ) End If End Function #tag EndEvent #tag Event Sub Change() If Me.RowTag( Me.ListIndex ) <> Nil Then ShowURL Me.RowTag( Me.ListIndex ) End If End Sub #tag EndEvent #tag EndEvents \ No newline at end of file diff --git a/ViMM/Windows/wndMain.rbfrm b/ViMM/Windows/wndMain.rbfrm old mode 100755 new mode 100644 diff --git a/ViMM/Windows/wndPreferences.rbfrm b/ViMM/Windows/wndPreferences.rbfrm old mode 100755 new mode 100644