• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Lấy thông tin của file nhạc trên mạng

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
Hình đại diện của người dùng
Zeroplus
Guru
Guru
Bài viết: 546
Ngày tham gia: T.Bảy 16/04/2011 11:31 pm
Đến từ: Gò Dầu - Tây Ninh
Has thanked: 6 time
Been thanked: 98 time
Liên hệ:

Lấy thông tin của file nhạc trên mạng

Gửi bàigửi bởi Zeroplus » T.Năm 27/09/2012 1:58 pm

Thủ thuật: Lấy thông tin của file nhạc trên mạng
Tác giả: Zeroplus
Mô tả: Lấy thông tin của file nhạc trên mạng giống như IDM



Đang viết chương trình Lấy link nhạc trên các trạng mạng nên phải dùng IDM thường xuyên và nhờ zậy mới để ý, Lúc nó bắt link 1 file nhạc. Trong phần mô tả nó còn để Dung lượng, Tên, Tác giả, Album, .... thấy rất hay nhưng chưa rõ nó làm như thế nào. Thế là tranh thủ hôm nay được nghĩ học buổi chiều tìm hiểu về nó. :D

Theo như mình biết thì thông tin file nhạc nằm ở 127 byte cuối cùng của file. Nếu như file nhạc đó trên máy tính thì dễ rồi. Chỉ cần dùng hàm Get đọc từ vị trí cuối file - 127 đến hết. Nhưng file trên internet thì sao ?? làm sao để có thể lấy 127 byte đó. Để ý kĩ mình thấy IDM còn có tính năng tải file nhanh bằng cách cắt file đó ra => Có thể dùng cách này để tải 127 byte đó về.
Google 1 tí thì mình thấy thường dùng .NET rồi GET,POST, Range gì gì đó. .NET thì không rành nên chắc phải tìm hiểu để viết bên VB 6.0. Bên VB 6.0 có 1 dll hỗ trợ HTTP. Đó là winhttp.dll hoặc msxml4,5,6.dll.

Ngồi loay hoay vọc vọc thì mình có hàm lấy kích thứoc file đó như sau
  1. Private Function FileSizeFromURL(ByVal sAddress) As Long
  2. Dim XMLHTTP
  3. Set XMLHTTP = CreateObject("Microsoft.XMLHTTP") ' Khởi tạo
  4. XMLHTTP.Open "GET", sAddress, False
  5. XMLHTTP.Send
  6. FileSizeFromURL = XMLHTTP.getResponseHeader("Content-Length") 'Lấy size file
  7. Set XMLHTTP = Nothing
  8. End Function
  9.  


và kiểu dữ liệu ID3Tag
  1. Private Type ID3Tag
  2.     Header As String * 3 ' 3 kí tự là "TAG"
  3.    Title As String * 30 '30 kí tự sau đó là tiêu đề. Nếu tiêu đề ít hơn 30 kí tự thì các kí tự còn lại là NULL
  4.    Artist  As String * 30 'Tương tự
  5.    Album  As String * 30 'Tương tự
  6.    Year  As String * 4 'Tương tự
  7. End Type


và bây giờ ta sẽ lấy số byte đó bằng code sau.
  1. Private Function ID3TagFromURL(ByVal sAddress As String, sID3Tag As ID3Tag) As Boolean
  2. Dim XMLHTTP, lpos As Long, Res() As Byte
  3. Set XMLHTTP = CreateObject("Microsoft.XMLHTTP") ' Khởi tạo
  4. lpos = FileSizeFromURL(sAddress) 'Lấy size file
  5. If lpos = 0 Then GoTo Err:
  6. XMLHTTP.Open "GET", sAddress, False
  7. XMLHTTP.setRequestHeader "Range", "bytes=" & lpos - 128 & "-" & lpos   ' "bytes=vị trí bắt đầu - vị trí kết thúc".
  8. XMLHTTP.Send
  9. Res() = XMLHTTP.responseBody ' Đọc số byte trả về
  10. Call CopyMemory(sID3Tag, Res(0), LenB(sID3Tag))
  11. If sID3Tag.Header <> "TAG" Then GoTo Err: ' Kiếm tra để biết nó có phải là file nhạc không
  12. ID3TagFromURL = True
  13. Err:
  14. Set XMLHTTP = Nothing 'Giải phóng
  15. End Function


Bây giờ các bạn chỉ cần thử sao chép vào VB và thử thôi :D ;;)

Toàn bộ code:
  1. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  2. Private Type ID3Tag
  3.     Header As String * 3
  4.     Title As String * 30
  5.     Artist  As String * 30
  6.     Album  As String * 30
  7.     Year  As String * 4
  8. End Type
  9.  
  10. Private Function ID3TagFromURL(ByVal sAddress As String, sID3Tag As ID3Tag) As Boolean
  11. Dim XMLHTTP, lpos As Long, Res() As Byte
  12. Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
  13. lpos = FileSizeFromURL(sAddress)
  14. If lpos = 0 Then GoTo Err:
  15. XMLHTTP.Open "GET", sAddress, False
  16. XMLHTTP.setRequestHeader "Range", "bytes=" & lpos - 128 & "-" & lpos
  17. XMLHTTP.Send
  18. Res() = XMLHTTP.responseBody
  19. Call CopyMemory(sID3Tag, Res(0), Len(sID3Tag))
  20. If sID3Tag.Header <> "TAG" Then GoTo Err:
  21. ID3TagFromURL = True
  22. Err:
  23. Set XMLHTTP = Nothing
  24. End Function
  25.  
  26. Private Function FileSizeFromURL(ByVal sAddress) As Long
  27. Dim XMLHTTP
  28. Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
  29. XMLHTTP.Open "GET", sAddress, False
  30. XMLHTTP.Send
  31. FileSizeFromURL = XMLHTTP.getResponseHeader("Content-Length")
  32. Set XMLHTTP = Nothing
  33. End Function
  34.  
  35. 'Sử dụng
  36. Dim sTag As ID3Tag
  37. ID3TagFromURL "Link đến file nhạc", sTag
  38. Msgbox sTag.Title
  39. Msgbox sTag.Artist
  40. MSgbox sTag.Album
  41. Msgbox sTag.Year
  42.  


Do trong lớp học văn rất dỡ nên viết có khi khó hiểu và trình bày không đẹp mắt. Mọi người thông cảm nhé :((
Sửa lần cuối bởi Zeroplus vào ngày T.Bảy 06/10/2012 6:58 pm với 1 lần sửa.



baohiep
Thành viên danh dự
Thành viên danh dự
Bài viết: 109
Ngày tham gia: CN 27/12/2009 6:37 pm
Đến từ: Tam Kỳ
Has thanked: 3 time
Been thanked: 9 time

Re: Lấy thông tin của file nhạc trên mạng

Gửi bàigửi bởi baohiep » T.Ba 02/10/2012 6:56 pm

Cảm ơn bạn. Bài viết rất hay và bổ ích.
I'm Hiep.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4762
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 515 time

Re: Lấy thông tin của file nhạc trên mạng

Gửi bàigửi bởi truongphu » T.Ba 02/10/2012 8:42 pm

Tôi test link:
http://mp3.zing.vn/download/song/Chi-La ... CykFcyvGZH

Bài: Chỉ là giấc mơ qua - Như Mai

Chả hiểu sao bị từ chối (Access is denied.) ở
XMLHTTP.Send

[nhưng dán vào trình duyệt thì tảo OK, Nhấn link trên sẽ rõ]

Thu gọn lại bài của 0+

  1. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  2. Private Type ID3Tag
  3.     Header As String * 3
  4.     Title As String * 30
  5.     Artist  As String * 30
  6.     Album  As String * 30
  7.     Year  As String * 4
  8. End Type
  9.  
  10. Private Function ID3TagFromURL(ByVal sAddress As String) As ID3Tag
  11.     Dim XMLHTTP, lpos As Long, Res() As Byte, sID3Tag As ID3Tag
  12.     Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
  13.         XMLHTTP.Open "GET", sAddress, False
  14.         XMLHTTP.Send
  15.         lpos = XMLHTTP.getResponseHeader("Content-Length")
  16.             If lpos = 0 Then GoTo Err:
  17.         XMLHTTP.Open "GET", sAddress, False
  18.         XMLHTTP.setRequestHeader "Range", "bytes=" & lpos - 128 & "-" & lpos
  19.         XMLHTTP.Send
  20.         Res() = XMLHTTP.responseBody
  21.         CopyMemory sID3Tag, Res(0), LenB(sID3Tag)
  22.     ID3TagFromURL = sID3Tag
  23. Err: Set XMLHTTP = Nothing
  24. End Function
  25.  
  26. Private Sub Command1_Click()
  27.     Dim zzz As ID3Tag
  28.     zzz = ID3TagFromURL(Text2)
  29.     Text1(0) = zzz.Title
  30.     Text1(1) = zzz.Artist
  31.     Text1(2) = zzz.Album
  32.     Text1(3) = zzz.Year
  33. End Sub
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
Zeroplus
Guru
Guru
Bài viết: 546
Ngày tham gia: T.Bảy 16/04/2011 11:31 pm
Đến từ: Gò Dầu - Tây Ninh
Has thanked: 6 time
Been thanked: 98 time
Liên hệ:

Re: Lấy thông tin của file nhạc trên mạng

Gửi bàigửi bởi Zeroplus » T.Bảy 06/10/2012 7:25 pm

truongphu đã viết:Tôi test link:
http://mp3.zing.vn/download/song/Chi-La ... CykFcyvGZH
Bài: Chỉ là giấc mơ qua - Như Mai
Chả hiểu sao bị từ chối (Access is denied.) ở
XMLHTTP.Send

[nhưng dán vào trình duyệt thì tảo OK, Nhấn link trên sẽ rõ]

1 số link cần có http:// + www hoặc bỏ www thì mới được phép truy cập. Chắc do chủ ý của các trang đó. Với lại link trên của bác không phải link trực tiếp nên không lấy được. Cháu dùng IDM lấy link trực tiếp nó như sau
http://dl2.hot2.cache10.vcdn.vn/fsdd1131lwwjA/31074da4103a8e427aa3405f2e498d7b/50700f30/2011/01/14/6/a/6aa40357a5a80846143e43d4c92968a3.mp3

Đến đây thì bác sẽ không bị lỗi nữa nhưng có điều là bác sẽ không nhận được kết quả do file này đặt ID3Tag ở đầu file chứ không phải cuối file.

Bác thử dùng link sau để test: http://www.yeucahat.com/downloads/538/5 ... com%29.mp3

truongphu đã viết:Thu gọn lại bài của 0+
  1. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  2. Private Type ID3Tag
  3.     Header As String * 3
  4.     Title As String * 30
  5.     Artist  As String * 30
  6.     Album  As String * 30
  7.     Year  As String * 4
  8. End Type
  9.  
  10. Private Function ID3TagFromURL(ByVal sAddress As String) As ID3Tag
  11.     Dim XMLHTTP, lpos As Long, Res() As Byte, sID3Tag As ID3Tag
  12.     Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
  13.         XMLHTTP.Open "GET", sAddress, False
  14.         XMLHTTP.Send
  15.         lpos = XMLHTTP.getResponseHeader("Content-Length")
  16.             If lpos = 0 Then GoTo Err:
  17.         XMLHTTP.Open "GET", sAddress, False
  18.         XMLHTTP.setRequestHeader "Range", "bytes=" & lpos - 128 & "-" & lpos
  19.         XMLHTTP.Send
  20.         Res() = XMLHTTP.responseBody
  21.         CopyMemory sID3Tag, Res(0), Len(sID3Tag)
  22.     ID3TagFromURL = sID3Tag
  23. Err: Set XMLHTTP = Nothing
  24. End Function
  25.  
  26. Private Sub Command1_Click()
  27.     Dim zzz As ID3Tag
  28.     zzz = ID3TagFromURL(Text2)
  29.     Text1(0) = zzz.Title
  30.     Text1(1) = zzz.Artist
  31.     Text1(2) = zzz.Album
  32.     Text1(3) = zzz.Year
  33. End Sub


Cháu đã sửa lại CopyMemory sID3Tag, Res(0), LenB(sID3Tag) thành CopyMemory sID3Tag, Res(0), Len(sID3Tag). Nếu không thì sẽ crash

dongphuong2999
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 54
Ngày tham gia: T.Sáu 02/07/2010 10:53 am
Has thanked: 1 time
Been thanked: 7 time
Liên hệ:

Re: Lấy thông tin của file nhạc trên mạng

Gửi bàigửi bởi dongphuong2999 » T.Tư 10/10/2012 9:42 am

em rất thích anh zero+
nhưng hôm nay anh chơi không đẹp bảo bác Phú dùng địa chỉ sai. rồi pót lên cái link die.

Em muốn share thêm cho các bạn hỉu
việc download ở một vị trí bất kì của file không phải lúc nào củng đc, tùy thuộc vào hót đó có dùng HTTP 1.1 không
hoặc nó cố ý không cho download ở vị trí bất kì.(cố tình muốn người dùng mua j đó) không cho ta resume ấy
khi một đị chỉ trang web các bác bỏ chử http www đi cho tiện
thực chử thì em không biết http:// or http://www muốn nói j
nhưng tên miền đâu bào gôm nó vd "caulacbovb.com/..." là đc

ví dụ thêm lấy thông tin bản mp3 "mp3.zing.vn/Test.mp3"


"GET /test.mp3 HTTP/1.1
User-Agent: tên ứng dụng mình j củng dc
Host: mp3.zing.vn
Accept: */*
Range: bytes=0-

"
Host sẻ phản hồi

"HTTP/1.1 200 OK
Date: Fri, 06 Apr 2012 04:45:56 GMT
Server: mp3.zing.vn
Last-Modified: Fri, 06 Apr 2012 04:16:46 GMT
Accept-Ranges: bytes
Content-Length: 99999
Content-Type: file/mp3 (tùy có thể khác text/html)
(+2 enter)
"
rồi đến dử liệu
mình lấy 99999 = size
rồi download lại với range: byte=99873-99999
rồi lấy

đọc cái này làm mình muốn viết code download file chia nhiều phần + resume

Hình đại diện của người dùng
Zeroplus
Guru
Guru
Bài viết: 546
Ngày tham gia: T.Bảy 16/04/2011 11:31 pm
Đến từ: Gò Dầu - Tây Ninh
Has thanked: 6 time
Been thanked: 98 time
Liên hệ:

Re: Lấy thông tin của file nhạc trên mạng

Gửi bàigửi bởi Zeroplus » T.Tư 10/10/2012 1:09 pm

dongphuong2999 đã viết:nhưng hôm nay anh chơi không đẹp bảo bác Phú dùng địa chỉ sai. rồi pót lên cái link die.

Trước hết cảm ơn dongphuong2999 đã góp ý và nếu có gì sai xót mong bác Truongphu và dongphuong2999 bỏ qua vì link mình gửi ở trên vẫn hoạt động ở thời điểm mình gửi bài,hiện tại thì đã die ( Nhưng chắc chắn rồi vì đa phần các trang nhạc hiện tại đâu có dùng link trực tiếp, nó sẽ tự thay đôi sau bao lâu thôi.)

dongphuong2999 đã viết:khi một địa chỉ trang web các bác bỏ chử http www đi cho tiện
thực chử thì em không biết http:// or http://www muốn nói j
nhưng tên miền đâu bao gồm nó vd "caulacbovb.com/..." là đc


Ban đầu khi tìm hiểu về nó, mình cũng đã bỏ www như bạn. Như ví dụ : Trang yeucahat.com mình dùng để test. Nếu bạn bỏ www ra thì chắc chắn bạn sẽ gặp lỗi Access is denied. Và 1 ví dụ nữa là nếu trang web nào đó dùng http://www.ABCDE.com mà không chỉnh chức năng chuyển lại thành http://ABCDEF.com thì mình nghĩ cũng không bỏ www được :(

HTTP Protocol thì mình chưa vững vì chỉ mài mò những thứ mình cần nên rất cần chỉ giáo thêm. :)

dongphuong2999
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 54
Ngày tham gia: T.Sáu 02/07/2010 10:53 am
Has thanked: 1 time
Been thanked: 7 time
Liên hệ:

Re: Lấy thông tin của file nhạc trên mạng

Gửi bàigửi bởi dongphuong2999 » T.Ba 30/10/2012 9:23 am

Zeroplus đã viết:Ban đầu khi tìm hiểu về nó, mình cũng đã bỏ www như bạn. Như ví dụ : Trang yeucahat.com mình dùng để test. Nếu bạn bỏ www ra thì chắc chắn bạn sẽ gặp lỗi Access is denied. Và 1 ví dụ nữa là nếu trang web nào đó dùng http://www.ABCDE.com mà không chỉnh chức năng chuyển lại thành http://ABCDEF.com thì mình nghĩ cũng không bỏ www được


Cái này chúng ta cần sủy nghỉ thêm.
cái lổi Access is denied muốn nỏi chổ nào thì mình không biết. Nhưng lổi đó là do cái object nó báo thế, có thể nó kiểm tra string xem người dùng kết nối đến một HTTP hay một Stream, dùng hàm mid tìm không thấy rồi báo lổi denied (mình nghỉ thôi)
Bởi nếu nó không biết là gì thì khi kết đến xong củng chẳng biết sẻ gửi cái gì => báo lổi chơi
Thực sự nói vậy nhưng mình không biết Stream là kiểu server gì, có lẻ đó là một phần trong lịch sử phát triển mạng... giờ đả quá củ hiếm có.

tóm lại, việc báo lổi là do control ta dùng, không thể kết luận được.
và một tên miền ip không chứa www or http. chỉ cần ABCDEF.com.canh là có thể kết nối được đến ip mình cân.


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách