Sign in Join
Wiki copytemporary

Download from SourceForge/pl: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-<div style="font-size:1.88em;margin:0.75em 0;">
2-
31Pobieranie z SourceForge
4-
5-</div>
62
73Możesz użyć biblioteki sieciowej [[Synapse]] do pobierania plików z SourceForge. Ponieważ SourceForge przechowuje pliki na wielu serwerach lustrzanych, musisz poradzić sobie z przekierowaniami.
84
95``` pascal
106...
117uses httpsend {moduł Synapse}
128...
139function DownloadHTTPStream(URL: string; Buffer: TStream): boolean;
1410 // Pobieranie pliku; w razie potrzeby próbuje ponownie.
1511const
1612 MaxRetries = 3;
1713var
1814 RetryAttempt: integer;
1915 HTTPGetResult: boolean;
2016begin
2117 Result:=false;
2218 RetryAttempt := 1;
2319 HTTPGetResult := False;
2420 while ((HTTPGetResult = False) and (RetryAttempt < MaxRetries)) do
2521 begin
2622 HTTPGetResult := HttpGetBinary(URL, Buffer);
2723 //Application.ProcessMessages;
2824 Sleep(100 * RetryAttempt);
2925 RetryAttempt := RetryAttempt + 1;
3026 end;
3127 if HTTPGetResult = False then
3228 raise Exception.Create('Nie można załadować dokumentu ze zdalnego serwera');
3329 Buffer.Position := 0;
3430 if Buffer.Size = 0 then
3531 raise Exception.Create('Pobrany dokument jest pusty.');
3632 Result := True;
3733end;
3834
3935function SFDirectLinkURL(URL: string; Document: TMemoryStream): string;
4036{
4137Przekształć tę część dokumentu:
4238<noscript>
4339<meta http-equiv="refresh" content="5; url=http://downloads.sourceforge.net/project/base64decoder/base64decoder/version%202.0/b64util.zip?r=&amp;ts=1329648745&amp;use_mirror=kent">
4440</noscript>
4541na poprawny adres URL:
4642http://downloads.sourceforge.net/project/base64decoder/base64decoder/version%202.0/b64util.zip?r=&amp;ts=1329648745&amp;use_mirror=kent
4743}
4844const
4945 Refresh='<meta http-equiv="refresh"';
5046 URLMarker='url=';
5147var
5248 Counter: integer;
5349 HTMLBody: TStringList;
5450 RefreshStart: integer;
5551 URLStart: integer;
5652begin
5753 HTMLBody:=TStringList.Create;
5854 try
5955 HTMLBody.LoadFromStream(Document);
6056 for Counter:=0 to HTMLBody.Count-1 do
6157 begin
6258 // Ta linia powinna znajdować się między tagami noscript i podawać bezpośrednią lokalizację pobierania:
6359 RefreshStart:=Ansipos(Refresh, HTMLBody[Counter]);
6460 if RefreshStart>0 then
6561 begin
6662 URLStart:=AnsiPos(URLMarker, HTMLBody[Counter])+Length(URLMarker);
6763 if URLStart>RefreshStart then
6864 begin
6965 // Znajdź cudzysłów zamykający "
7066 URL:=Copy(HTMLBody[Counter],
7167 URLStart,
7268 PosEx('"',HTMLBody[Counter],URLStart+1)-URLStart);
7369 infoln('debug: nowy adres URL po tagu noscript:');
7470 infoln(URL);
7571 break;
7672 end;
7773 end;
7874 end;
7975 finally
8076 HTMLBody.Free;
8177 end;
8278 result:=URL;
8379end;
8480
8581function SourceForgeURL(URL: string): string;
8682// Wykrywa pobieranie z sourceforge i próbuje poradzić sobie
8783// z przekierowaniami i wyodrębnieniem bezpośredniego linku do pobrania.
8884// Dziękuję
8985// Ocye: http://lazarus.freepascal.org/index.php/topic,13425.msg70575.html#msg70575
9086
9187const
9288 SFProjectPart = '//sourceforge.net/projects/';
9389 SFFilesPart = '/files/';
9490 SFDownloadPart ='/download';
9591var
9692 HTTPSender: THTTPSend;
9793 i, j: integer;
9894 FoundCorrectURL: boolean;
9995 SFDirectory: string; //Katalog Sourceforge
10096 SFDirectoryBegin: integer;
10197 SFFileBegin: integer;
10298 SFFilename: string; //Nazwa pliku Sourceforge
10399 SFProject: string;
104100 SFProjectBegin: integer;
105101begin
106102 // Wykryj pobieranie SourceForge; np. z adresu URL
107103 // 1 2 3 4 5 6 7 8 9
108104 // 1234557890123456789012345578901234567890123455789012345678901234557890123456789012345578901234567890
109105 // http://sourceforge.net/projects/base64decoder/files/base64decoder/version%202.0/b64util.zip/download
110106 // ^^^projekt^^^ ^^^katalog..............^^^ ^^^plik^^^
111107 FoundCorrectURL:=true; //Załóżmy, że nie jest to pobieranie z SourceForge
112108 i:=Pos(SFProjectPart, URL);
113109 if i>0 then
114110 begin
115111 // Ewentualnie znaleziony projekt; teraz wyodrębnij części projektu, katalogu i nazwy pliku.
116112 SFProjectBegin:=i+Length(SFProjectPart);
117113 j := PosEx(SFFilesPart, URL, SFProjectBegin);
118114 if (j>0) then
119115 begin
120116 SFProject:=Copy(URL, SFProjectBegin, j-SFProjectBegin);
121117 SFDirectoryBegin:=PosEx(SFFilesPart, URL, SFProjectBegin)+Length(SFFilesPart);
122118 if SFDirectoryBegin>0 then
123119 begin
124120 // Znajdź plik
125121 // URL może mieć końcowe argumenty... więc: wyszukaj pierwszą
126122 // napotkaną nazwę z prawej strony, ale powinna być po /files/
127123 i:=RPos(SFDownloadPart, URL);
128124 // Teraz poszukaj poprzedni ukośnik /, abyśmy mogli rozpoznać plik.
129125 // Może to być końcowy / w /files/
130126 SFFileBegin:=RPosEx('/',URL,i-1)+1;
131127
132128 if SFFileBegin>0 then
133129 begin
134130 SFFilename:=Copy(URL,SFFileBegin, i-SFFileBegin);
135131 //Uwzględnij końcowy ukośnik /
136132 SFDirectory:=Copy(URL, SFDirectoryBegin, SFFileBegin-SFDirectoryBegin);
137133 FoundCorrectURL:=false;
138134 end;
139135 end;
140136 end;
141137 end;
142138
143139 if not FoundCorrectURL then
144140 begin
145141 try
146142 // Przepisz adres URL, jeśli jest to konieczne do przekierowania pobierania Sourceforge
147143 // Wykryj bezpośredni link w treści HTML i uzyskaj z niego adres URL
148144 HTTPSender := THTTPSend.Create;
149145 //Kto wie, może to pomóc:
150146 HTTPSender.UserAgent:='curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18';
151147 while not FoundCorrectURL do
152148 begin
153149 HTTPSender.HTTPMethod('GET', URL);
154150 infoln('debug: headers:');
155151 infoln(HTTPSender.Headers.Text);
156152 case HTTPSender.Resultcode of
157153 301, 302, 307:
158154 begin
159155 for i := 0 to HTTPSender.Headers.Count - 1 do
160156 if (Pos('Location: ', HTTPSender.Headers.Strings[i]) > 0) or
161157 (Pos('location: ', HTTPSender.Headers.Strings[i]) > 0) then
162158 begin
163159 j := Pos('use_mirror=', HTTPSender.Headers.Strings[i]);
164160 if j > 0 then
165161 URL :=
166162 'http://' + RightStr(HTTPSender.Headers.Strings[i],
167163 length(HTTPSender.Headers.Strings[i]) - j - 10) +
168164 '.dl.sourceforge.net/project/' +
169165 SFProject + '/' + SFDirectory + SFFilename
170166 else
171167 URL:=StringReplace(
172168 HTTPSender.Headers.Strings[i], 'Location: ', '', []);
173169 HTTPSender.Clear;//httpsend
174170 FoundCorrectURL:=true;
175171 break; // opuść pętlę przepisywania
176172 end;
177173 end;
178174 100..200:
179175 begin
180176 //Pobierz stronę sourceforge z bezpośredniego linku
181177 URL:=SFDirectLinkURL(URL, HTTPSender.Document); //Zapytaj
182178 FoundCorrectURL:=true; //Już skończyliśmy
183179 end;
184180 500: raise Exception.Create('Brak połączenia internetowego');
185181 //Internal Server Error ('+aURL+')');
186182 else
187183 raise Exception.Create('Pobieranie nie powiodło się. Kod błędu ' +
188184 IntToStr(HTTPSender.ResultCode) + ' (' + HTTPSender.ResultString + ')');
189185 end;//case
190186 end;//while
191187 infoln('debug: wynikowy adres URL po przekierowaniu sf: *' + URL + '*');
192188 finally
193189 HTTPSender.Free;
194190 end;
195191 end;
196192 result:=URL;
197193end;
198194```
199195
200196Następnie możesz pobrać plik standardową metodą.
201197
202198``` pascal
203199...
204200function DownloadHTTP(URL, TargetFile: string): boolean;
205201// Pobieranie pliku; w razie potrzeby spróbuj ponownie.
206202// Oferty z linkami do pobierania SourceForge
207203var
208204 Buffer: TMemoryStream;
209205begin
210206 result:=false;
211207 URL:=SourceForgeURL(URL); //Zajmij się adresami URL Sourceforge
212208 try
213209 Buffer := TMemoryStream.Create;
214210 DownloadHTTPStream(URL, Buffer);
215211 Buffer.SaveToFile(TargetFile);
216212 result:=true;
217213 finally
218214 FreeAndNil(Buffer);
219215 end;
220216end;
221217```
222218
223219## Zobacz także
224220
225221- [[Synapse/pl|Synapse]]
226222
227223---
228224*From the Free Pascal wiki, page "Download from SourceForge/pl", as it stood on 2022-07-06 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history