Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
VideoLAN
VLC-iOS
Commits
3fc601b4
Commit
3fc601b4
authored
May 29, 2015
by
Felix Paul Kühne
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
library: update the thumbnail to the last displayed frame when remember poisition is updated
(cherry picked from commit
3b460694
)
parent
9b005e74
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
128 additions
and
36 deletions
+128
-36
Sources/VLCPlaybackController.m
Sources/VLCPlaybackController.m
+72
-19
Sources/VLCPlaylistCollectionViewCell.m
Sources/VLCPlaylistCollectionViewCell.m
+11
-0
Sources/VLCPlaylistTableViewCell.m
Sources/VLCPlaylistTableViewCell.m
+11
-0
Sources/VLCThumbnailsCache.h
Sources/VLCThumbnailsCache.h
+2
-0
Sources/VLCThumbnailsCache.m
Sources/VLCThumbnailsCache.m
+32
-17
No files found.
Sources/VLCPlaybackController.m
View file @
3fc601b4
...
...
@@ -49,6 +49,7 @@
BOOL
_needsMetadataUpdate
;
BOOL
_mediaWasJustStarted
;
BOOL
_recheckForExistingThumbnail
;
}
@end
...
...
@@ -364,25 +365,76 @@
-
(
void
)
_savePlaybackState
{
if
(
self
.
fileFromMediaLibrary
)
{
@try
{
MLFile
*
item
=
self
.
fileFromMediaLibrary
;
item
.
lastPosition
=
@
([
_mediaPlayer
position
]);
item
.
lastAudioTrack
=
@
(
_mediaPlayer
.
currentAudioTrackIndex
);
item
.
lastSubtitleTrack
=
@
(
_mediaPlayer
.
currentVideoSubTitleIndex
);
}
@catch
(
NSException
*
exception
)
{
APLog
(
@"failed to save current media state - file removed?"
);
}
}
else
{
MLFile
*
fileItem
=
self
.
fileFromMediaLibrary
;
if
(
!
fileItem
)
{
NSArray
*
files
=
[
MLFile
fileForURL
:
_mediaPlayer
.
media
.
url
];
if
(
files
.
count
>
0
)
{
MLFile
*
fileFromList
=
files
.
firstObject
;
fileFromList
.
lastPosition
=
@
([
_mediaPlayer
position
]);
fileFromList
.
lastAudioTrack
=
@
(
_mediaPlayer
.
currentAudioTrackIndex
);
fileFromList
.
lastSubtitleTrack
=
@
(
_mediaPlayer
.
currentVideoSubTitleIndex
);
}
if
(
files
.
count
>
0
)
fileItem
=
files
.
firstObject
;
}
if
(
!
fileItem
)
return
;
@try
{
float
position
=
_mediaPlayer
.
position
;
fileItem
.
lastPosition
=
@
(
position
);
fileItem
.
lastAudioTrack
=
@
(
_mediaPlayer
.
currentAudioTrackIndex
);
fileItem
.
lastSubtitleTrack
=
@
(
_mediaPlayer
.
currentVideoSubTitleIndex
);
if
(
position
>
.
95
)
return
;
NSArray
*
searchPaths
=
NSSearchPathForDirectoriesInDomains
(
NSCachesDirectory
,
NSUserDomainMask
,
YES
);
NSString
*
newThumbnailPath
=
[
searchPaths
[
0
]
stringByAppendingPathComponent
:
@"VideoSnapshots"
];
NSFileManager
*
fileManager
=
[
NSFileManager
defaultManager
];
if
(
!
[
fileManager
fileExistsAtPath
:
newThumbnailPath
])
[
fileManager
createDirectoryAtPath
:
newThumbnailPath
withIntermediateDirectories
:
YES
attributes
:
nil
error
:
nil
];
newThumbnailPath
=
[
newThumbnailPath
stringByAppendingPathComponent
:
fileItem
.
objectID
.
URIRepresentation
.
lastPathComponent
];
[
_mediaPlayer
saveVideoSnapshotAt
:
newThumbnailPath
withWidth
:
0
andHeight
:
0
];
_recheckForExistingThumbnail
=
YES
;
[
self
performSelector
:
@selector
(
_updateStoredThumbnailForFile
:)
withObject
:
fileItem
afterDelay
:
.
25
];
}
@catch
(
NSException
*
exception
)
{
APLog
(
@"failed to save current media state - file removed?"
);
}
}
-
(
void
)
_updateStoredThumbnailForFile
:(
MLFile
*
)
fileItem
{
NSFileManager
*
fileManager
=
[
NSFileManager
defaultManager
];
NSArray
*
searchPaths
=
NSSearchPathForDirectoriesInDomains
(
NSCachesDirectory
,
NSUserDomainMask
,
YES
);
NSString
*
newThumbnailPath
=
[
searchPaths
[
0
]
stringByAppendingPathComponent
:
@"VideoSnapshots"
];
newThumbnailPath
=
[
newThumbnailPath
stringByAppendingPathComponent
:
fileItem
.
objectID
.
URIRepresentation
.
lastPathComponent
];
if
(
!
[
fileManager
fileExistsAtPath
:
newThumbnailPath
])
{
if
(
_recheckForExistingThumbnail
)
{
[
self
performSelector
:
@selector
(
_updateStoredThumbnailForFile
:)
withObject
:
fileItem
afterDelay
:
1
.];
_recheckForExistingThumbnail
=
NO
;
}
else
return
;
}
UIImage
*
newThumbnail
=
[
UIImage
imageWithContentsOfFile
:
newThumbnailPath
];
if
(
!
newThumbnail
)
{
if
(
_recheckForExistingThumbnail
)
{
[
self
performSelector
:
@selector
(
_updateStoredThumbnailForFile
:)
withObject
:
fileItem
afterDelay
:
1
.];
_recheckForExistingThumbnail
=
NO
;
}
else
return
;
}
@try
{
[
fileItem
setComputedThumbnailScaledForDevice
:
newThumbnail
];
}
@catch
(
NSException
*
exception
)
{
APLog
(
@"updating thumbnail failed"
);
}
[
fileManager
removeItemAtPath
:
newThumbnailPath
error
:
nil
];
}
-
(
void
)
observeValueForKeyPath
:(
NSString
*
)
keyPath
ofObject
:(
id
)
object
change
:(
NSDictionary
*
)
change
context
:(
void
*
)
context
...
...
@@ -505,9 +557,10 @@
#pragma mark - playback controls
-
(
void
)
playPause
{
if
([
_mediaPlayer
isPlaying
])
if
([
_mediaPlayer
isPlaying
])
{
[
_listPlayer
pause
];
else
[
self
_savePlaybackState
];
}
else
[
_listPlayer
play
];
}
...
...
Sources/VLCPlaylistCollectionViewCell.m
View file @
3fc601b4
...
...
@@ -128,6 +128,7 @@
[
_mediaObject
removeObserver
:
self
forKeyPath
:
@"album"
];
[
_mediaObject
removeObserver
:
self
forKeyPath
:
@"artist"
];
[
_mediaObject
removeObserver
:
self
forKeyPath
:
@"genre"
];
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
self
];
[(
MLFile
*
)
_mediaObject
didHide
];
}
}
...
...
@@ -166,6 +167,10 @@
[
_mediaObject
addObserver
:
self
forKeyPath
:
@"album"
options
:
0
context
:
nil
];
[
_mediaObject
addObserver
:
self
forKeyPath
:
@"artist"
options
:
0
context
:
nil
];
[
_mediaObject
addObserver
:
self
forKeyPath
:
@"genre"
options
:
0
context
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector:
@selector
(
thumbnailWasUpdated
:)
name:
MLFileThumbnailWasUpdated
object:
nil
];
[(
MLFile
*
)
_mediaObject
willDisplay
];
}
}
...
...
@@ -510,4 +515,10 @@
return
!
self
.
metaDataLabel
.
hidden
;
}
-
(
void
)
thumbnailWasUpdated
:(
NSNotification
*
)
aNotification
{
self
.
thumbnailView
.
contentMode
=
UIViewContentModeScaleAspectFill
;
self
.
thumbnailView
.
image
=
[
VLCThumbnailsCache
thumbnailForManagedObject
:
self
.
mediaObject
refreshCache
:
YES
];
}
@end
Sources/VLCPlaylistTableViewCell.m
View file @
3fc601b4
...
...
@@ -93,6 +93,7 @@
[
_mediaObject
removeObserver
:
self
forKeyPath
:
@"album"
];
[
_mediaObject
removeObserver
:
self
forKeyPath
:
@"artist"
];
[
_mediaObject
removeObserver
:
self
forKeyPath
:
@"genre"
];
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
self
];
[(
MLFile
*
)
_mediaObject
didHide
];
}
}
...
...
@@ -131,6 +132,10 @@
[
_mediaObject
addObserver
:
self
forKeyPath
:
@"album"
options
:
0
context
:
nil
];
[
_mediaObject
addObserver
:
self
forKeyPath
:
@"artist"
options
:
0
context
:
nil
];
[
_mediaObject
addObserver
:
self
forKeyPath
:
@"genre"
options
:
0
context
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector:
@selector
(
thumbnailWasUpdated
:)
name:
MLFileThumbnailWasUpdated
object:
nil
];
[(
MLFile
*
)
_mediaObject
willDisplay
];
}
}
...
...
@@ -525,4 +530,10 @@
[
UIView
animateWithDuration
:
animationDuration
animations
:
animationBlock
completion
:
completionBlock
];
}
-
(
void
)
thumbnailWasUpdated
:(
NSNotification
*
)
aNotification
{
self
.
thumbnailView
.
contentMode
=
UIViewContentModeScaleAspectFill
;
self
.
thumbnailView
.
image
=
[
VLCThumbnailsCache
thumbnailForManagedObject
:
self
.
mediaObject
refreshCache
:
YES
];
}
@end
Sources/VLCThumbnailsCache.h
View file @
3fc601b4
...
...
@@ -16,6 +16,8 @@
+
(
UIImage
*
)
thumbnailForManagedObject
:(
NSManagedObject
*
)
object
;
+
(
UIImage
*
)
thumbnailForManagedObject
:(
NSManagedObject
*
)
object
refreshCache
:(
BOOL
)
refreshCache
;
+
(
UIImage
*
)
thumbnailForManagedObject
:(
NSManagedObject
*
)
object
toFitRect
:(
CGRect
)
rect
shouldReplaceCache
:(
BOOL
)
replaceCache
;
@end
Sources/VLCThumbnailsCache.m
View file @
3fc601b4
...
...
@@ -74,22 +74,28 @@
}
+
(
UIImage
*
)
thumbnailForManagedObject
:(
NSManagedObject
*
)
object
{
return
[
self
thumbnailForManagedObject
:
object
refreshCache
:
NO
];
}
+
(
UIImage
*
)
thumbnailForManagedObject
:(
NSManagedObject
*
)
object
refreshCache
:(
BOOL
)
refreshCache
{
UIImage
*
thumbnail
;
VLCThumbnailsCache
*
cache
=
[
VLCThumbnailsCache
sharedThumbnailCache
];
if
([
object
isKindOfClass
:[
MLShow
class
]])
{
thumbnail
=
[
cache
thumbnailForShow
:(
MLShow
*
)
object
];
thumbnail
=
[
cache
thumbnailForShow
:(
MLShow
*
)
object
refreshCache
:
refreshCache
];
}
else
if
([
object
isKindOfClass
:[
MLShowEpisode
class
]])
{
MLFile
*
anyFileFromEpisode
=
[(
MLShowEpisode
*
)
object
files
].
anyObject
;
thumbnail
=
[
cache
thumbnailForMediaFile
:
anyFileFromEpisode
];
thumbnail
=
[
cache
thumbnailForMediaFile
:
anyFileFromEpisode
refreshCache
:
refreshCache
];
}
else
if
([
object
isKindOfClass
:[
MLLabel
class
]])
{
thumbnail
=
[
cache
thumbnailForLabel
:(
MLLabel
*
)
object
];
thumbnail
=
[
cache
thumbnailForLabel
:(
MLLabel
*
)
object
refreshCache
:
refreshCache
];
}
else
if
([
object
isKindOfClass
:[
MLAlbum
class
]])
{
thumbnail
=
[
cache
thumbnailForAlbum
:(
MLAlbum
*
)
object
];
thumbnail
=
[
cache
thumbnailForAlbum
:(
MLAlbum
*
)
object
refreshCache
:
refreshCache
];
}
else
if
([
object
isKindOfClass
:[
MLAlbumTrack
class
]])
{
thumbnail
=
[
cache
thumbnailForAlbumTrack
:(
MLAlbumTrack
*
)
object
];
thumbnail
=
[
cache
thumbnailForAlbumTrack
:(
MLAlbumTrack
*
)
object
refreshCache
:
refreshCache
];
}
else
{
thumbnail
=
[
cache
thumbnailForMediaFile
:(
MLFile
*
)
object
];
thumbnail
=
[
cache
thumbnailForMediaFile
:(
MLFile
*
)
object
refreshCache
:
refreshCache
];
}
return
thumbnail
;
}
...
...
@@ -117,16 +123,19 @@
[
_thumbnailCache
setObject
:
image
forKey
:
objID
];
}
-
(
UIImage
*
)
thumbnailForMediaFile
:(
MLFile
*
)
mediaFile
-
(
UIImage
*
)
thumbnailForMediaFile
:(
MLFile
*
)
mediaFile
refreshCache
:(
BOOL
)
refreshCache
{
if
(
mediaFile
==
nil
||
mediaFile
.
objectID
==
nil
)
return
nil
;
NSManagedObjectID
*
objID
=
mediaFile
.
objectID
;
UIImage
*
displayedImage
=
[
_thumbnailCache
objectForKey
:
objID
]
;
UIImage
*
displayedImage
;
if
(
displayedImage
)
return
displayedImage
;
if
(
!
refreshCache
)
{
displayedImage
=
[
_thumbnailCache
objectForKey
:
objID
];
if
(
displayedImage
)
return
displayedImage
;
}
if
(
!
displayedImage
)
{
__block
UIImage
*
computedImage
=
nil
;
...
...
@@ -146,7 +155,7 @@
return
displayedImage
;
}
-
(
UIImage
*
)
thumbnailForShow
:(
MLShow
*
)
mediaShow
-
(
UIImage
*
)
thumbnailForShow
:(
MLShow
*
)
mediaShow
refreshCache
:(
BOOL
)
refreshCache
{
NSManagedObjectID
*
objID
=
mediaShow
.
objectID
;
UIImage
*
displayedImage
;
...
...
@@ -158,6 +167,9 @@
if
(
previousCount
.
unsignedIntegerValue
!=
count
)
forceRefresh
=
YES
;
if
(
refreshCache
)
forceRefresh
=
YES
;
if
(
!
forceRefresh
)
{
displayedImage
=
[
_thumbnailCache
objectForKey
:
objID
];
if
(
displayedImage
)
...
...
@@ -183,7 +195,7 @@
return
displayedImage
;
}
-
(
UIImage
*
)
thumbnailForLabel
:(
MLLabel
*
)
mediaLabel
-
(
UIImage
*
)
thumbnailForLabel
:(
MLLabel
*
)
mediaLabel
refreshCache
:(
BOOL
)
refreshCache
{
NSManagedObjectID
*
objID
=
mediaLabel
.
objectID
;
UIImage
*
displayedImage
;
...
...
@@ -195,6 +207,9 @@
if
(
previousCount
.
unsignedIntegerValue
!=
count
)
forceRefresh
=
YES
;
if
(
refreshCache
)
forceRefresh
=
YES
;
if
(
!
forceRefresh
)
{
displayedImage
=
[
_thumbnailCache
objectForKey
:
objID
];
if
(
displayedImage
)
...
...
@@ -215,7 +230,7 @@
return
displayedImage
;
}
-
(
UIImage
*
)
thumbnailForAlbum
:(
MLAlbum
*
)
album
-
(
UIImage
*
)
thumbnailForAlbum
:(
MLAlbum
*
)
album
refreshCache
:(
BOOL
)
refreshCache
{
__block
MLAlbumTrack
*
track
=
nil
;
void
(
^
getFileBlock
)(
void
)
=
^
(){
...
...
@@ -226,10 +241,10 @@
else
dispatch_sync
(
dispatch_get_main_queue
(),
getFileBlock
);
return
[
self
thumbnailForAlbumTrack
:
track
];
return
[
self
thumbnailForAlbumTrack
:
track
refreshCache
:
refreshCache
];
}
-
(
UIImage
*
)
thumbnailForAlbumTrack
:(
MLAlbumTrack
*
)
albumTrack
-
(
UIImage
*
)
thumbnailForAlbumTrack
:(
MLAlbumTrack
*
)
albumTrack
refreshCache
:(
BOOL
)
refreshCache
{
__block
MLFile
*
anyFileFromAnyTrack
=
nil
;
void
(
^
getFileBlock
)(
void
)
=
^
(){
...
...
@@ -239,7 +254,7 @@
getFileBlock
();
else
dispatch_sync
(
dispatch_get_main_queue
(),
getFileBlock
);
return
[
self
thumbnailForMediaFile
:
anyFileFromAnyTrack
];
return
[
self
thumbnailForMediaFile
:
anyFileFromAnyTrack
refreshCache
:
refreshCache
];
}
-
(
UIImage
*
)
clusterThumbFromFiles
:(
NSArray
*
)
files
andNumber
:(
NSUInteger
)
fileNumber
blur
:(
BOOL
)
blurImage
...
...
@@ -276,7 +291,7 @@
NSUInteger
iter
=
files
.
count
<
fileNumber
?
files
.
count
:
fileNumber
;
for
(
NSUInteger
i
=
0
;
i
<
iter
;
i
++
)
{
MLFile
*
file
=
[
files
objectAtIndex
:
i
];
clusterThumb
=
[
self
thumbnailForMediaFile
:
file
];
clusterThumb
=
[
self
thumbnailForMediaFile
:
file
refreshCache
:
NO
];
CGContextRef
context
=
UIGraphicsGetCurrentContext
();
CGFloat
imagePartWidth
=
(
imageSize
.
width
/
iter
);
//the rect in which the image should be drawn
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment