From 864081102a5f252415f41950b3039a896b4ae9c5 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Mon, 8 Oct 2012 18:43:29 +0000 Subject: Awkwars's plugins - welcome to our trunk git-svn-id: http://svn.miranda-ng.org/main/trunk@1822 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Watrack/myshows/myshows.pas | 333 ++++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 plugins/Watrack/myshows/myshows.pas (limited to 'plugins/Watrack/myshows/myshows.pas') diff --git a/plugins/Watrack/myshows/myshows.pas b/plugins/Watrack/myshows/myshows.pas new file mode 100644 index 0000000000..ce07ee0d68 --- /dev/null +++ b/plugins/Watrack/myshows/myshows.pas @@ -0,0 +1,333 @@ +unit myshows; +{$include compilers.inc} +interface +{$Resource myshows.res} +implementation + +uses windows, messages, commctrl, + common, + m_api,dbsettings,wrapper, mirutils, + wat_api,global; + +const + DefTimerValue = 10*60*1000; // 10 minutes +const + opt_ModStatus:PAnsiChar = 'module/myshows'; +const + IcoMyShows:pAnsiChar = 'WATrack_myshows'; +type + tMyShowsData = record + series :PAnsiChar; + series_id :PAnsiChar; + kinopoisk_id:PAnsiChar; + episode :PAnsiChar; + episode_id :PAnsiChar; + info :PAnsiChar; + image :PAnsiChar; + end; +var + msh_tries, +// msh_timeout, + msh_scrobpos:integer; + sic:THANDLE; +// slastinf:THANDLE; + slast:THANDLE; + MSData:tMyShowsData; +const + msh_on :integer=0; + hMenuMyShows:HMENU = 0; + msh_login :pAnsiChar=nil; + msh_password:pAnsiChar=nil; + session_id :pAnsiChar=nil; + np_url :pAnsiChar=nil; + sub_url :pAnsiChar=nil; + +procedure ClearData; +begin + mFreeMem(MSData.series); + mFreeMem(MSData.series_id); + mFreeMem(MSData.kinopoisk_id); + mFreeMem(MSData.episode); + mFreeMem(MSData.episode_id); + mFreeMem(MSData.info); + mFreeMem(MSData.image); + FillChar(MSData,SizeOf(MSData),0); +end; + +function GetModStatus:integer; +begin + result:=DBReadByte(0,PluginShort,opt_ModStatus,1); +end; + +procedure SetModStatus(stat:integer); +begin + DBWriteByte(0,PluginShort,opt_ModStatus,stat); +end; + +{$i i_const.inc} +{$i i_myshows_opt.inc} +{$i i_myshows_api.inc} + +procedure ThScrobble(param:LPARAM); cdecl; +var + count:integer; +begin + count:=msh_tries; + repeat + dec(count); + if Scrobble(count<=0) then break; + until count<=0; +end; + +const + hTimer:THANDLE=0; + +procedure TimerProc(wnd:HWND;uMsg:uint;idEvent:uint_ptr;dwTime:dword); stdcall; +begin + if hTimer<>0 then + begin + KillTimer(0,hTimer); + hTimer:=0; + end; + + if (msh_login <>nil) and (msh_login^ <>#0) and + (msh_password<>nil) and (msh_password^<>#0) then + CloseHandle(mir_forkthread(@ThScrobble,nil)); +end; + +function NewPlStatus(wParam:WPARAM;lParam:LPARAM):int;cdecl; +var + flag:integer; + mi:TCListMenuItem; + timervalue:integer; +begin + result:=0; + case wParam of + WAT_EVENT_NEWTRACK: begin + if hTimer<>0 then + KillTimer(0,hTimer); + // need to use half of movie len if presents + if msh_on=0 then + begin + if pSongInfo(lParam).width>0 then // for video only + begin + if ServiceExists(MS_JSON_GETINTERFACE)<>0 then + begin + timervalue:=integer(pSongInfo(lParam).total)*10*msh_scrobpos; // 1000(msec) div 100(%) + if timervalue=0 then + timervalue:=DefTimerValue; + hTimer:=SetTimer(0,0,timervalue,@TimerProc); + end; + end; + end; + end; + + WAT_EVENT_PLUGINSTATUS: begin + case lParam of + dsEnabled: begin + msh_on:=msh_on and not 2; + flag:=0; + end; + dsPermanent: begin + msh_on:=msh_on or 2; + if hTimer<>0 then + begin + KillTimer(0,hTimer); + hTimer:=0; + end; + flag:=CMIF_GRAYED; + end; + else // like 1 + exit + end; + FillChar(mi,sizeof(mi),0); + mi.cbSize:=sizeof(mi); + mi.flags :=CMIM_FLAGS+flag; + CallService(MS_CLIST_MODIFYMENUITEM,hMenuMyShows,tlParam(@mi)); + end; + + WAT_EVENT_PLAYERSTATUS: begin + case Integer(loword(lParam)) of + WAT_PLS_NOMUSIC,WAT_PLS_NOTFOUND: begin + if hTimer<>0 then + begin + KillTimer(0,hTimer); + hTimer:=0; + end; + end; + end; + end; + end; +end; + +{$i i_myshows_dlg.inc} + +function IconChanged(wParam:WPARAM;lParam:LPARAM):int;cdecl; +var + mi:TCListMenuItem; +begin + result:=0; + FillChar(mi,SizeOf(mi),0); + mi.cbSize:=sizeof(mi); + mi.flags :=CMIM_ICON; + mi.hIcon :=CallService(MS_SKIN2_GETICON,0,tLParam(IcoMyShows)); + CallService(MS_CLIST_MODIFYMENUITEM,hMenuMyShows,tlParam(@mi)); +end; + +(* kinopoisk link, cover, series? +function SrvMyShowsInfo(wParam:WPARAM;lParam:LPARAM):int;cdecl; +//var +// data:tMyShowsInfo; +begin + result:=0; +{ + case wParam of + 0: result:=GetArtistInfo(data,lParam); + 1: result:=GetAlbumInfo (data,lParam); + 2: result:=GetTrackInfo (data,lParam); + else + result:=0; + end; +} +end; +*) +function SrvMyShows(wParam:WPARAM;lParam:LPARAM):int;cdecl; +var + mi:TCListMenuItem; +begin + FillChar(mi,sizeof(mi),0); + mi.cbSize:=sizeof(mi); + mi.flags :=CMIM_NAME; + if odd(msh_on) then + begin + mi.szName.a:='Disable scrobbling'; + msh_on:=msh_on and not 1; + end + else + begin + mi.szName.a:='Enable scrobbling'; + msh_on:=msh_on or 1; + if hTimer<>0 then + begin + KillTimer(0,hTimer); + hTimer:=0; + end; + end; + CallService(MS_CLIST_MODIFYMENUITEM,hMenuMyShows,tlParam(@mi)); + result:=ord(not odd(msh_on)); +end; + +procedure CreateMenus; +var + mi:TCListMenuItem; + sid:TSKINICONDESC; +begin + FillChar(sid,SizeOf(TSKINICONDESC),0); + sid.cbSize:=SizeOf(TSKINICONDESC); + sid.cx:=16; + sid.cy:=16; + sid.szSection.a:='WATrack'; + + sid.hDefaultIcon :=LoadImage(hInstance,'IDI_MYSHOWS',IMAGE_ICON,16,16,0); + sid.pszName :=IcoMyShows; + sid.szDescription.a:='MyShows'; + Skin_AddIcon(@sid); + DestroyIcon(sid.hDefaultIcon); + + FillChar(mi, sizeof(mi), 0); + mi.cbSize :=sizeof(mi); + mi.szPopupName.a:=PluginShort; + + mi.hIcon :=CallService(MS_SKIN2_GETICON,0,tlParam(IcoMyShows)); + mi.szName.a :='Disable scrobbling'; + mi.pszService :=MS_WAT_MYSHOWS; + mi.popupPosition:=500050000; + hMenuMyShows:=Menu_AddMainMenuItem(@mi); +end; + +// ------------ base interface functions ------------- + +function AddOptionsPage(var tmpl:pAnsiChar;var proc:pointer;var name:PAnsiChar):integer; +begin + tmpl:='MYSHOWS'; + proc:=@DlgProcOptions; + name:='MyShows'; + result:=0; +end; + +var + plStatusHook:THANDLE; + +function InitProc(aGetStatus:boolean=false):integer; +begin +// slastinf:=CreateServiceFunction(MS_WAT_MYSHOWSINFO,@SrvMyShowsInfo); + if aGetStatus then + begin + if GetModStatus=0 then + begin + result:=0; + exit; + end; + end + else + begin + SetModStatus(1); + msh_on:=msh_on and not 4; + end; + result:=1; + + LoadOpt; + + slast:=CreateServiceFunction(MS_WAT_MYSHOWS,@SrvMyShows); + if hMenuMyShows=0 then + CreateMenus; + sic:=HookEvent(ME_SKIN2_ICONSCHANGED,@IconChanged); + if (msh_on and 4)=0 then + plStatusHook:=HookEvent(ME_WAT_NEWSTATUS,@NewPlStatus); +end; + +procedure DeInitProc(aSetDisable:boolean); +begin + if aSetDisable then + SetModStatus(0) + else +;// DestroyServiceFunction(slastinf); + + DestroyServiceFunction(slast); + UnhookEvent(plStatusHook); + UnhookEvent(sic); + + if hTimer<>0 then + begin + KillTimer(0,hTimer); + hTimer:=0; + end; + + FreeOpt; + + mFreeMem(session_id); + mFreeMem(np_url); + mFreeMem(sub_url); + + msh_on:=msh_on or 4; + + mFreeMem(cookies); //!! +end; + +var + mmyshows:twModule; + +procedure Init; +begin + mmyshows.Next :=ModuleLink; + mmyshows.Init :=@InitProc; + mmyshows.DeInit :=@DeInitProc; + mmyshows.AddOption :=@AddOptionsPage; + mmyshows.ModuleName:='MyShows.ru'; + ModuleLink :=@mmyshows; + +end; + +begin + Init; +end. -- cgit v1.2.3